Compiled by Curtis Kephart, curtis.kephart@nyu.edu, with R Markdown Notebook.

2017-07-10 13:38:00 GMT, America/Chicago


Real Effort Task

Below, a table of each subject’s RET preformance.




Public Good Game

Subjects played ten VCM rounds. As rounds progressed, rates of public goods contribution declined.

Comparing between MPCRs, the higher rates generally had approximately 10% higher public good contribution rates on average.

Warning message:
Unknown column 'player.Nature' 

Stage Game

Treatment subject summary tables

Below, reports the overall percent each terminal node choice was selected by stage game groups. Number of groups are the numbers below divided by two.

MPCR N Subjects
0.30 36
0.75 20

Below, reports how terminal node choices evolved as the session progressed over each of ten rounds.

Groups in the stage game were fixed.

Below, breaks down terminal node choice dynamics by MPCR treatment.

Warning message:
Unknown column 'player.Nature' 

Selections were elicited via the strategy method. For example, even if A1 was selected by the role A player, Role F would still be asked what they would choose if A had chosen A2 previously. At the end of each round, the terminal node and payoffs were revealed to both players. And the next round begins with the strategy method again.

Below reports the percent of time each choice was selected at each decision.

Nature was selected by a random number generated via the experiment software, with probability of N1 = 0.75.

The plot below breaks the above plot down by MPCR treatment.

Warning message:
Unknown column 'player.Nature' 

Below, the table shows the average rates at which each MPCR treatment groups reached each possible terminal node.

These groups were composed of two-players in ten repeated rounds. We find the average number of times each group reached each possible terminal node. There were 18 such groups in the MPCR = 0.3 treatment, and 10 such groups in the MPCR = 0.75 treatment regime.

The table is arranged to make it easy to compare terminal node rates between MPCR regimes.

terminal_node A1 A1 F1 F1 A3 A3 Nature Nature
mpcr 0.30 0.75 0.30 0.75 0.30 0.75 0.30 0.75
average 0.256 0.430 0.100 0.190 0.511 0.190 0.133 0.190
se 0.0149 0.0422 0.0071 0.0307 0.0166 0.0238 0.0076 0.0242
n 18 10 18 10 18 10 18 10
[1] "###############################################################################"
Do groups in MPCR 0.3 and 0.75 reach A1 at the same rates?
    Wilcoxon rank sum test with continuity correction

data:  (df_tab %>% filter(mpcr == 0.3 & terminal_node == "A1"))$percent and (df_tab %>% filter(mpcr == 0.75 & terminal_node == "A1"))$percent
W = 71, p-value = 0.3594
alternative hypothesis: true location shift is not equal to 0

[1] "###############################################################################"
[1] "Do groups in MPCR 0.3 and 0.75 reach F1 at the same rates?"

    Wilcoxon rank sum test with continuity correction

data:  (df_tab %>% filter(mpcr == 0.3 & terminal_node == "F1"))$percent and (df_tab %>% filter(mpcr == 0.75 & terminal_node == "F1"))$percent
W = 89, p-value = 0.9791
alternative hypothesis: true location shift is not equal to 0

[1] "###############################################################################"
[1] "Do groups in MPCR 0.3 and 0.75 reach A3 at the same rates?"

    Wilcoxon rank sum test with continuity correction

data:  (df_tab %>% filter(mpcr == 0.3 & terminal_node == "A3"))$percent and (df_tab %>% filter(mpcr == 0.75 & terminal_node == "A3"))$percent
W = 143.5, p-value = 0.01032
alternative hypothesis: true location shift is not equal to 0

[1] "###############################################################################"
[1] "Do groups in MPCR 0.3 and 0.75 reach Nature at the same rates?"

    Wilcoxon rank sum test with continuity correction

data:  (df_tab %>% filter(mpcr == 0.3 & terminal_node == "Nature"))$percent and (df_tab %>% filter(mpcr == 0.75 & terminal_node == "Nature"))$percent
W = 82.5, p-value = 0.7284
alternative hypothesis: true location shift is not equal to 0

[1] "###############################################################################"

We only see a significant difference between groups’ inclination to reach terminal node A3.


Inequality Aversion

Below we consider the effect of varying public good contributions on the terminal nodes selected by players in the stage game.

The stage game was played by two-players. Each player had some average public good contribution from their ten rounds of the VCM game.

In the plot below, we see the distribution of these two-player-group differences in public good contributions for each terminal node selected. A large difference implies one player contributed a lot more to the public good relative to the other, while a small difference means the two players contributued at similar rates. The plot above labeled “Average Group Exchange from VCM” shows the public good contributions of each group in the stage game.

The plot shows that F1 tended to be selected where public good contribution differences were the smallest within groups. While players tended to reach the nature node where differences in group exchange contributions were the highest.


Reaching Nature

Below is a parametric test,

\(N_{g} = \beta_0 + \beta_1 \cdot \delta MPCR_{g} + \beta_3 \cdot ln(GEdiff_g) + \epsilon_{g}\)

  • Where \(N_{g}\) is the percent of the time group \(g\) reached nature as their terminal node,
  • \(\delta MPCR_{g}\) is 1 if this group faced a MPCR of 0.3 and 0 otherwise,
  • \(GEdiff_g\) is this group’s difference between player average public good contribution rates in the VCM game.
There were 11 warnings (use warnings() to see them)

Call:
lm(formula = Nature_percent ~ MPCR_0.30 + log(GE_diff), data = df_group)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.22744 -0.10023 -0.03750  0.05252  0.52020 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept)   0.28716    0.06909   4.156 0.000331 ***
MPCR_0.30    -0.03623    0.06712  -0.540 0.594134    
log(GE_diff)  0.06979    0.03157   2.210 0.036468 *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.1685 on 25 degrees of freedom
Multiple R-squared:  0.1833,    Adjusted R-squared:  0.118 
F-statistic: 2.806 on 2 and 25 DF,  p-value: 0.07955

Below is another parametric test, this time using group-round level observations to test the following,

\(N_{gt} = \beta_0 + \beta_1 \cdot \delta MPCR_{g} + \beta_3 \cdot ln(GEdiff_g) + \epsilon_{gt}\)

  • Where \(N_{gt}\) is 1 if group \(g\) eached nature as terminal node in round \(t\) and 0 otherwise,
  • \(\delta MPCR_{g}\) is 1 if this group faced a MPCR of 0.3 and 0 otherwise,
  • \(GEdiff_g\) is this group’s difference between player average public good contribution rates in the VCM game.

Call:
lm(formula = Nature ~ MPCR_0.30 + log(GE_diff), data = df_per)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.27980 -0.19749 -0.13500 -0.04046  0.96245 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept)   0.28716    0.04595   6.250 1.54e-09 ***
MPCR_0.30    -0.03623    0.04463  -0.812  0.41769    
log(GE_diff)  0.06979    0.02100   3.324  0.00101 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.3545 on 277 degrees of freedom
Multiple R-squared:  0.0438,    Adjusted R-squared:  0.0369 
F-statistic: 6.344 on 2 and 277 DF,  p-value: 0.002023

Reaching F1

Below is a parametric test,

\(F1_{g} = \beta_0 + \beta_1 \cdot \delta MPCR_{g} + \beta_3 \cdot ln(GEdiff_g) + \epsilon_{g}\)

  • Where \(F1_{g}\) is the percent of the time group \(g\) reached F1 as their terminal node,
  • \(\delta MPCR_{g}\) is 1 if this group faced a MPCR of 0.3 and 0 otherwise,
  • \(GEdiff_g\) is this group’s difference between player average public good contribution rates in the VCM game.

Call:
lm(formula = F1_percent ~ MPCR_0.30 + log(GE_diff), data = df_group)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.29176 -0.13154 -0.04023  0.04979  0.55105 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)
(Intercept)   0.11350    0.08372   1.356    0.187
MPCR_0.30    -0.10609    0.08133  -1.304    0.204
log(GE_diff) -0.05495    0.03826  -1.436    0.163

Residual standard error: 0.2043 on 25 degrees of freedom
Multiple R-squared:  0.1169,    Adjusted R-squared:  0.04629 
F-statistic: 1.655 on 2 and 25 DF,  p-value: 0.2113

Below is another parametric test, this time using group-round level observations to test the following,

\(F1_{gt} = \beta_0 + \beta_1 \cdot \delta MPCR_{g} + \beta_3 \cdot ln(GEdiff_g) + \epsilon_{gt}\)

  • Where \(F1_{gt}\) is 1 if group \(g\) eached F1 as terminal node in round \(t\) and 0 otherwise,
  • \(\delta MPCR_{g}\) is 1 if this group faced a MPCR of 0.3 and 0 otherwise,
  • \(GEdiff_g\) is this group’s difference between player average public good contribution rates in the VCM game.

Call:
lm(formula = F1 ~ MPCR_0.30 + log(GE_diff), data = df_per)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.29176 -0.17313 -0.10985 -0.04649  0.95052 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)   
(Intercept)   0.11350    0.04317   2.629  0.00904 **
MPCR_0.30    -0.10609    0.04194  -2.530  0.01198 * 
log(GE_diff) -0.05495    0.01973  -2.785  0.00572 **
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.3331 on 277 degrees of freedom
Multiple R-squared:  0.04301,   Adjusted R-squared:  0.0361 
F-statistic: 6.225 on 2 and 277 DF,  p-value: 0.002268

Reaching A1

Below is a parametric test,

\(A1_{g} = \beta_0 + \beta_1 \cdot \delta MPCR_{g} + \beta_3 \cdot ln(GEdiff_g) + \epsilon_{g}\)

  • Where \(A1_{g}\) is the percent of the time group \(g\) reached A1 as their terminal node,
  • \(\delta MPCR_{g}\) is 1 if this group faced a MPCR of 0.3 and 0 otherwise,
  • \(GEdiff_g\) is this group’s difference between player average public good contribution rates in the VCM game.

Call:
lm(formula = A1_percent ~ MPCR_0.30 + log(GE_diff), data = df_group)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.52391 -0.22329 -0.06372  0.22744  0.55824 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept)   0.53160    0.13405   3.966 0.000541 ***
MPCR_0.30    -0.15307    0.13022  -1.175 0.250892    
log(GE_diff)  0.07298    0.06126   1.191 0.244734    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.327 on 25 degrees of freedom
Multiple R-squared:  0.115, Adjusted R-squared:  0.04419 
F-statistic: 1.624 on 2 and 25 DF,  p-value: 0.2172

Below is another parametric test, this time using group-round level observations to test the following,

\(A1_{gt} = \beta_0 + \beta_1 \cdot \delta MPCR_{g} + \beta_3 \cdot ln(GEdiff_g) + \epsilon_{gt}\)

  • Where \(A1_{gt}\) is 1 if group \(g\) eached A1 as terminal node in round \(t\) and 0 otherwise,
  • \(\delta MPCR_{g}\) is 1 if this group faced a MPCR of 0.3 and 0 otherwise,
  • \(GEdiff_g\) is this group’s difference between player average public good contribution rates in the VCM game.

Call:
lm(formula = A1 ~ MPCR_0.30 + log(GE_diff), data = df_per)

Residuals:
    Min      1Q  Median      3Q     Max 
-0.5239 -0.3266 -0.2168  0.5582  0.8446 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept)   0.53160    0.05892   9.022  < 2e-16 ***
MPCR_0.30    -0.15307    0.05724  -2.674  0.00794 ** 
log(GE_diff)  0.07298    0.02693   2.710  0.00714 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.4546 on 277 degrees of freedom
Multiple R-squared:  0.05722,   Adjusted R-squared:  0.05041 
F-statistic: 8.406 on 2 and 277 DF,  p-value: 0.0002856

Reaching A3

Below is a parametric test,

\(A3_{g} = \beta_0 + \beta_1 \cdot \delta MPCR_{g} + \beta_3 \cdot ln(GEdiff_g) + \epsilon_{g}\)

  • Where \(A3_{g}\) is the percent of the time group \(g\) reached A3 as their terminal node,
  • \(\delta MPCR_{g}\) is 1 if this group faced a MPCR of 0.3 and 0 otherwise,
  • \(GEdiff_g\) is this group’s difference between player average public good contribution rates in the VCM game.

Call:
lm(formula = A3_percent ~ MPCR_0.30 + log(GE_diff), data = df_group)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.44560 -0.15392 -0.07804  0.11240  0.59169 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)  
(Intercept)   0.06774    0.11020   0.615   0.5443  
MPCR_0.30     0.29539    0.10706   2.759   0.0107 *
log(GE_diff) -0.08782    0.05036  -1.744   0.0935 .
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.2689 on 25 degrees of freedom
Multiple R-squared:  0.3282,    Adjusted R-squared:  0.2744 
F-statistic: 6.106 on 2 and 25 DF,  p-value: 0.006932

Below is another parametric test, this time using group-round level observations to test the following,

\(A3_{gt} = \beta_0 + \beta_1 \cdot \delta MPCR_{g} + \beta_3 \cdot ln(GEdiff_g) + \epsilon_{gt}\)

  • Where \(A3_{gt}\) is 1 if group \(g\) eached A3 as terminal node in round \(t\) and 0 otherwise,
  • \(\delta MPCR_{g}\) is 1 if this group faced a MPCR of 0.3 and 0 otherwise,
  • \(GEdiff_g\) is this group’s difference between player average public good contribution rates in the VCM game.
There were 17 warnings (use warnings() to see them)

Call:
lm(formula = A3 ~ MPCR_0.30 + log(GE_diff), data = df_per)

Residuals:
    Min      1Q  Median      3Q     Max 
-0.7319 -0.4256 -0.1758  0.4422  0.8917 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept)   0.06774    0.05940   1.140  0.25511    
MPCR_0.30     0.29539    0.05771   5.119 5.76e-07 ***
log(GE_diff) -0.08782    0.02715  -3.235  0.00136 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.4583 on 277 degrees of freedom
Multiple R-squared:  0.1317,    Adjusted R-squared:  0.1255 
F-statistic: 21.01 on 2 and 277 DF,  p-value: 3.183e-09


Compiled 2017-07-10 18:38:14 GMT

LS0tCnRpdGxlOiAiQ1NSIEluaXRpYWwgQW5hbHlzaXMiCm91dHB1dDoKICBwZGZfZG9jdW1lbnQ6CiAgICBmaWdfaGVpZ2h0OiA0CiAgICBmaWdfd2lkdGg6IDYuNgogIGh0bWxfbm90ZWJvb2s6CiAgICBmaWdfaGVpZ2h0OiA0CiAgICBmaWdfd2lkdGg6IDEwLjYKICBodG1sX2RvY3VtZW50OgogICAgZmlnX2hlaWdodDogNAogICAgZmlnX3dpZHRoOiAxMC42Ci0tLQoKYGBge3IsIGVjaG89RiwgcmVzdWx0cz0nYXNpcyd9CgpjYXQoCiAgIiBDb21waWxlZCBieSBDdXJ0aXMgS2VwaGFydCwgY3VydGlzLmtlcGhhcnRAbnl1LmVkdSwgIiwKICAiIHdpdGggW1IgTWFya2Rvd25dKGh0dHA6Ly9ybWFya2Rvd24ucnN0dWRpby5jb20pIE5vdGVib29rLiAiLAogIHNlcCA9ICIiCikKYGBgCgpgYGB7ciwgZWNobz1GLCByZXN1bHRzPSdhc2lzJ30KCmNhdCgKICBhcy5jaGFyYWN0ZXIoU3lzLnRpbWUoKSksIiBHTVQsICIsCiAgU3lzLnRpbWV6b25lKGxvY2F0aW9uID0gVFJVRSksCiAgc2VwID0gIiIKKQpgYGAKCgoKYGBge3IsIGVjaG8gPSBGQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgZXJyb3I9RkFMU0UsIGNhY2hlPUZBTFNFfQojJyBmb3Igd29ya2lnbiB3aXRoIHJtYXJrZG93biwgIAojJyBzZWUgaHR0cHM6Ly93d3cucnN0dWRpby5jb20vd3AtY29udGVudC91cGxvYWRzLzIwMTUvMDIvcm1hcmtkb3duLWNoZWF0c2hlZXQucGRmIAoKc291cmNlKCJldGxfcHJvZC5yIikKbGlicmFyeShrbml0cikgI2ZvciB0aGUga2FibGUgdGFibGVzCmxpYnJhcnkodGlkeXIpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShkcGx5cikKYGBgCgoKLS0tLQoKIyMgUmVhbCBFZmZvcnQgVGFzawoKQmVsb3csIGEgdGFibGUgb2YgZWFjaCBzdWJqZWN0J3MgUkVUIHByZWZvcm1hbmNlLiAKCmBgYHtyLCBlY2hvID0gRkFMU0UsZXZhbCA9IEZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBlcnJvcj1GQUxTRSwgY2FjaGU9RkFMU0V9CgpkZiA9IHJldCAlPiUKICBncm91cF9ieShwYXJ0aWNpcGFudC5jb2RlKSU+JQogIGZpbHRlcighaXMubmEocGxheWVyLmlzX2NvcnJlY3QpKSAlPiUKICBtdXRhdGUocGxheWVyLmlzX2NvcnJlY3QgPSBhcy5udW1lcmljKHBsYXllci5pc19jb3JyZWN0KSkgJT4lCiAgc3VtbWFyaXNlKAogICAgcmV0X3RyaWVkID0gbGVuZ3RoKHBsYXllci5pc19jb3JyZWN0KSwKICAgIHJldF9jb3JyZWN0ID0gc3VtKHBsYXllci5pc19jb3JyZWN0KSwKICAgIHJldF9jb3JyZWN0UmF0ZSA9IG1lYW4ocGxheWVyLmlzX2NvcnJlY3QqIDEwMCkgJT4lIHJvdW5kKDApICU+JSBwYXN0ZSgiJSIsIHNlcD0iIikgLAogICAgcmV0X3Njb3JlID0gbWF4KGFzLm51bWVyaWMocGxheWVyLnJldF9maW5hbF9zY29yZSkpCiAgKSAlPiUKICBhcnJhbmdlKGRlc2MocmV0X2NvcnJlY3QpKSAlPiUKICB1bmdyb3VwKCkKCmthYmxlKAogIGZvcm1hdCA9ICJtYXJrZG93biIsIAogIGNvbC5uYW1lcyA9IGMoIlBsYXllciBJRCIsIlJFVDxicj5UcmllZCIsICJSRVQ8YnI+Q29ycmVjdCIsICJSYXRlIiwgIlNjb3JlIiksCiAgYWxpZ249J2MnLAogIGRmCikKCmBgYAoKCgoKYGBge3IsIGVjaG8gPSBGQUxTRSwgbWVzc2FnZT1GQUxTRSwgZmlnLmhlaWdodD00LCBmaWcud2lkdGg9NS41LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBlcnJvcj1GQUxTRSwgY2FjaGU9RkFMU0V9CgpnZ3Bsb3QoCiAgcmV0ICU+JQogIGdyb3VwX2J5KHBhcnRpY2lwYW50LmNvZGUpICU+JQogIGZpbHRlcighaXMubmEocGxheWVyLmlzX2NvcnJlY3QpKSAlPiUKICBtdXRhdGUocGxheWVyLmlzX2NvcnJlY3QgPSBhcy5udW1lcmljKHBsYXllci5pc19jb3JyZWN0KSkgJT4lCiAgc3VtbWFyaXNlKAogICAgcmV0X3RyaWVkID0gbGVuZ3RoKHBsYXllci5pc19jb3JyZWN0KSwKICAgIHJldF9jb3JyZWN0ID0gc3VtKHBsYXllci5pc19jb3JyZWN0KSwKICAgIHJldF9jb3JyZWN0UmF0ZSA9IG1lYW4ocGxheWVyLmlzX2NvcnJlY3QpCiAgKSAlPiUKICBhcnJhbmdlKGRlc2MocmV0X2NvcnJlY3QpKSwKICBhZXMoeCA9IHJldF90cmllZCwKICAgICAgeSA9IHJldF9jb3JyZWN0KQopICsKICBnZW9tX3BvaW50KCkgKyAKICB0aGVtZV9taW5pbWFsKCkgKyAKICBsYWJzKAogICAgeCA9ICJUYXNrcyBBdHRlbXB0ZWQiLAogICAgeSA9ICJUYXNrcyBTdWNjZWVkZWQiCiAgKQoKYGBgCgotLS0tIAoKYGBge3IsIGVjaG8gPSBGQUxTRSwgbWVzc2FnZT1GQUxTRSwgZmlnLmhlaWdodD00LCBmaWcud2lkdGg9NS41LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBlcnJvcj1GQUxTRSwgY2FjaGU9RkFMU0V9CgpnZ3Bsb3QoCiAgcmV0ICU+JQogIGdyb3VwX2J5KHBhcnRpY2lwYW50LmNvZGUpJT4lCiAgZmlsdGVyKCFpcy5uYShwbGF5ZXIuaXNfY29ycmVjdCkpICU+JQogIG11dGF0ZShwbGF5ZXIuaXNfY29ycmVjdCA9IGFzLm51bWVyaWMocGxheWVyLmlzX2NvcnJlY3QpKSAlPiUKICBzdW1tYXJpc2UoCiAgICByZXRfdHJpZWQgPSBsZW5ndGgocGxheWVyLmlzX2NvcnJlY3QpLAogICAgcmV0X2NvcnJlY3QgPSBzdW0ocGxheWVyLmlzX2NvcnJlY3QpLAogICAgcmV0X2NvcnJlY3RSYXRlID0gbWVhbihwbGF5ZXIuaXNfY29ycmVjdCogMTAwKSAlPiUgcm91bmQoMCkgJT4lIHBhc3RlKCIlIiwgc2VwPSIiKSAsCiAgICBTY29yZSA9IG1heChhcy5udW1lcmljKHBsYXllci5yZXRfZmluYWxfc2NvcmUpKQogICkgICU+JQogIGRwbHlyOjphcnJhbmdlKGRlc2MocmV0X2NvcnJlY3QpKSwKICBhZXMoeCA9IHJldF9jb3JyZWN0LAogICAgICB5ID0gU2NvcmUpCikgKwogIGdlb21faml0dGVyKAogICAgYWxwaGEgPSAuNSwKICAgIGhlaWdodCA9IDApICsKICBnZ3Bsb3QyOjp5bGltKDAsMjUpICsKICBsYWJzKAogICAgeCA9ICJOdW1iZXIgb2YgQ29ycmVjdCBUeXBpbmcgVGFza3MiLAogICAgeSA9ICJTY29yZSIKICApICsKICB0aGVtZV9taW5pbWFsKCkKYGBgCgotLS0tIAoKYGBge3IsIGVjaG8gPSBGQUxTRSwgbWVzc2FnZT1GQUxTRSwgZmlnLmhlaWdodD00LCBmaWcud2lkdGg9NS41LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBlcnJvcj1GQUxTRSwgY2FjaGU9RkFMU0V9CmdncGxvdCgKICByZXQgJT4lCiAgZ3JvdXBfYnkocGFydGljaXBhbnQuY29kZSkgJT4lCiAgZmlsdGVyKCFpcy5uYShwbGF5ZXIuaXNfY29ycmVjdCkpICU+JQogIG11dGF0ZShwbGF5ZXIuaXNfY29ycmVjdCA9IGFzLm51bWVyaWMocGxheWVyLmlzX2NvcnJlY3QpKSAlPiUKICBzdW1tYXJpc2UoCiAgICByZXRfdHJpZWQgPSBsZW5ndGgocGxheWVyLmlzX2NvcnJlY3QpLAogICAgcmV0X2NvcnJlY3QgPSBzdW0ocGxheWVyLmlzX2NvcnJlY3QpLAogICAgcmV0X2NvcnJlY3RSYXRlID0gbWVhbihwbGF5ZXIuaXNfY29ycmVjdCksCiAgICBTY29yZSA9IG1heChwbGF5ZXIucmV0X2ZpbmFsX3Njb3JlKQogICkgJT4lCiAgYXJyYW5nZShkZXNjKHJldF9jb3JyZWN0KSksCiAgYWVzKHggPSByZXRfY29ycmVjdCwKICAgICAgeSA9IHJldF9jb3JyZWN0UmF0ZSkKKSArCiAgZ2VvbV9wb2ludCgpICsKICAgIGxhYnMoCiAgICB4ID0gIk51bWJlciBvZiBDb3JyZWN0IFR5cGluZyBUYXNrcyIsCiAgICB5ID0gIkNvcnJlY3QgVGFzayBSYXRlIgogICkgKwogIHRoZW1lX21pbmltYWwoKQpgYGAKCi0tLS0gCgpgYGB7ciwgZWNobyA9IEZBTFNFLCBtZXNzYWdlPUZBTFNFLCBmaWcuaGVpZ2h0PTQsIGZpZy53aWR0aD01LjUsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGVycm9yPUZBTFNFLCBjYWNoZT1GQUxTRX0KZ2dwbG90KAogIHJldCAlPiUKICBncm91cF9ieShwYXJ0aWNpcGFudC5jb2RlKSAlPiUKICBmaWx0ZXIoIWlzLm5hKHBsYXllci5pc19jb3JyZWN0KSkgJT4lCiAgbXV0YXRlKHBsYXllci5pc19jb3JyZWN0ID0gYXMubnVtZXJpYyhwbGF5ZXIuaXNfY29ycmVjdCkpICU+JQogIHN1bW1hcmlzZSgKICAgIHJldF90cmllZCA9IGxlbmd0aChwbGF5ZXIuaXNfY29ycmVjdCksCiAgICByZXRfY29ycmVjdCA9IHN1bShwbGF5ZXIuaXNfY29ycmVjdCksCiAgICByZXRfY29ycmVjdFJhdGUgPSBtZWFuKHBsYXllci5pc19jb3JyZWN0KSwKICAgIFNjb3JlID0gbWF4KGFzLm51bWVyaWMocGxheWVyLnJldF9maW5hbF9zY29yZSkpCiAgKSAlPiUKICBhcnJhbmdlKGRlc2MocmV0X2NvcnJlY3QpKSwKICBhZXMoeCA9IHJldF90cmllZCwKICAgICAgeSA9IFNjb3JlLAogICAgKQopICsKICBsYWJzKCAgCiAgdGl0bGUgPSAiUmVhbCBFZmZvcnQgVGFzayIsCiAgeCA9ICJOdW1iZXIgb2YgVHJpZWQgVHlwaW5nIFRhc2tzIiAKKSArCiAgZ2VvbV9wb2ludCgpICsKICB0aGVtZV9taW5pbWFsKCkKCgpgYGAKCgpgYGB7ciwgZWNobyA9IEZBTFNFLCBtZXNzYWdlPUZBTFNFLCBmaWcuaGVpZ2h0PTQsIGZpZy53aWR0aD01LjUsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGVycm9yPUZBTFNFLCBjYWNoZT1GQUxTRX0KCgpnZ3Bsb3QoCiAgcmV0ICU+JQogIGdyb3VwX2J5KHBhcnRpY2lwYW50LmNvZGUpICU+JQogIGZpbHRlcighaXMubmEocGxheWVyLmlzX2NvcnJlY3QpKSAlPiUKICBtdXRhdGUocGxheWVyLmlzX2NvcnJlY3QgPSBhcy5udW1lcmljKHBsYXllci5pc19jb3JyZWN0KSkgJT4lCiAgc3VtbWFyaXNlKAogICAgcmV0X3RyaWVkID0gbGVuZ3RoKHBsYXllci5pc19jb3JyZWN0KSwKICAgIHJldF9jb3JyZWN0ID0gc3VtKHBsYXllci5pc19jb3JyZWN0KSwKICAgIHJldF9jb3JyZWN0UmF0ZSA9IG1lYW4ocGxheWVyLmlzX2NvcnJlY3QpLAogICAgU2NvcmUgPSBtYXgoYXMubnVtZXJpYyhwbGF5ZXIucmV0X2ZpbmFsX3Njb3JlKSkKICApICU+JQogIGFycmFuZ2UoZGVzYyhyZXRfY29ycmVjdCkpLAogIGFlcyh4ID0gU2NvcmUKICAgICkKKSArCiAgbGFicyggIAogIHRpdGxlID0gIkRpc3RyaWJ1dGlvbiBvZiBSZWFsIEVmZm9ydCBUYXNrIFNjb3JlcyIsCiAgeCA9ICJTY29yZSIsIAogIHkgPSAiQ291bnQiCikgKwogIGdlb21faGlzdG9ncmFtKCkgKwogIHRoZW1lX2J3KCkKCgpgYGAKCiMjIFB1YmxpYyBHb29kIEdhbWUKCgpgYGB7ciwgZWNobyA9IEZBTFNFLCBtZXNzYWdlPUZBTFNFLCBmaWcuaGVpZ2h0PTQsIGZpZy53aWR0aD01LjUsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGVycm9yPUZBTFNFLCBjYWNoZT1GQUxTRX0KCgpkZiA9IFZDTSAlPiUKICBtdXRhdGUoIAogICAgR3JvdXBfRXhjaGFuZ2UgPSBwbGF5ZXIuZ3JvdXBfZXhjaGFuZ2VfcGVyY2VudCwgCiAgICBJbmRpdmlkdWFsX0V4Y2hhbmdlID0gMSAtIEdyb3VwX0V4Y2hhbmdlCiAgKSAlPiUKICBzZWxlY3QoCiAgICBSb3VuZCA9IHN1YnNlc3Npb24ucm91bmRfbnVtYmVyLAogICAgR3JvdXBfRXhjaGFuZ2UsIAogICAgSW5kaXZpZHVhbF9FeGNoYW5nZSwKICAgIFBsYXllciA9IHBhcnRpY2lwYW50LmNvZGUsCiAgICBNUENSID0gcGxheWVyLm1wY3IsCiAgICBldmVyeXRoaW5nKCkKICApICU+JQogIGRwbHlyOjpmaWx0ZXIoCiAgICAhaXMubmEoR3JvdXBfRXhjaGFuZ2UpCiAgKQogIApnZ3Bsb3QoCiAgZGYsIAogIGFlcygKICAgIHggPSBHcm91cF9FeGNoYW5nZQogICkKKSArIGdlb21faGlzdG9ncmFtKCkgKwogIGxhYnMoCiAgICB4ID0gIlB1YmxpYyBHb29kIENvbnRyaWJ1dGlvbiBQZXJjZW50IiwKICAgIHkgPSAiQ291bnQiLCAKICAgIHRpdGxlID0gIkRpc3RyaWJ1dGlvbiBvZiBQdWJsaWMgR29vZCBDb250cmlidXRpb25zIgogICkgKwogIHRoZW1lX21pbmltYWwoKQoKYGBgCgoKYGBge3IsIGVjaG8gPSBGQUxTRSwgbWVzc2FnZT1GQUxTRSwgZmlnLmhlaWdodD00LCBmaWcud2lkdGg9NS41LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBlcnJvcj1GQUxTRX0KCgoKZGYgPSBWQ00gJT4lCiAgc2VsZWN0KAogICAgUm91bmQgPSBzdWJzZXNzaW9uLnJvdW5kX251bWJlciwKICAgIFBsYXllciA9IHBhcnRpY2lwYW50LmNvZGUsCiAgICBNUENSID0gcGxheWVyLm1wY3IsCiAgICBgR3JvdXAgRXhjaGFuZ2VgID0gcGxheWVyLmdyb3VwX2V4Y2hhbmdlX3BlcmNlbnQKICApICU+JSAKICBtdXRhdGUoCiAgICBgSW5kaXZpZHVhbF9FeGNoYW5nZWAgPSAxIC0gYEdyb3VwIEV4Y2hhbmdlYCwKICAgIE1QQ1IgPSBwYXN0ZSgiTVBDUjoiLE1QQ1IpCiAgKSAlPiUKICBmaWx0ZXIoCiAgICAhaXMubmEoYEdyb3VwIEV4Y2hhbmdlYCkKICApCmRmID0gICB0aWR5cjo6Z2F0aGVyKAogIGRmLCAKICBUeXBlLCBDb250cmlidXRpb24sCiAgYEdyb3VwIEV4Y2hhbmdlYDpgSW5kaXZpZHVhbF9FeGNoYW5nZWApCgpnZ3Bsb3QoCiAgZGYsIAogIGFlcygKICAgIHggPSBDb250cmlidXRpb24KICApCikgKyBnZW9tX2hpc3RvZ3JhbSgpICsKICBsYWJzKAogICAgeCA9ICJQdWJsaWMgR29vZCBDb250cmlidXRpb24gUGVyY2VudCIsCiAgICB5ID0gIkNvdW50IiwgCiAgICB0aXRsZSA9ICJEaXN0cmlidXRpb24gb2YgUHVibGljIEdvb2QgQ29udHJpYnV0aW9ucyIKICApICsKICBmYWNldF9ncmlkKFR5cGV+TVBDUiApICsKICB0aGVtZV9idygpICsgCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSAzMCkpCmBgYAoKCgpgYGB7ciwgZWNobyA9IEZBTFNFLCBtZXNzYWdlPUZBTFNFLCBmaWcuaGVpZ2h0PTQsIGZpZy53aWR0aD01LjUsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGVycm9yPUZBTFNFfQoKCgpkZiA9IFZDTSAlPiUKICBzZWxlY3QoCiAgICBSb3VuZCA9IHN1YnNlc3Npb24ucm91bmRfbnVtYmVyLAogICAgUGxheWVyID0gcGFydGljaXBhbnQuY29kZSwKICAgIE1QQ1IgPSBwbGF5ZXIubXBjciwKICAgIGBHcm91cCBFeGNoYW5nZWAgPSBwbGF5ZXIuZ3JvdXBfZXhjaGFuZ2VfcGVyY2VudAogICkgJT4lIAogIG11dGF0ZSgKICAgIGBJbmRpdmlkdWFsX0V4Y2hhbmdlYCA9IDEgLSBgR3JvdXAgRXhjaGFuZ2VgLAogICAgTVBDUiA9IHBhc3RlKCJNUENSOiIsTVBDUikKICApICU+JQogIGZpbHRlcigKICAgICFpcy5uYShgR3JvdXAgRXhjaGFuZ2VgKQogICkKZGYgPSAgIHRpZHlyOjpnYXRoZXIoCiAgZGYsIAogIFR5cGUsIENvbnRyaWJ1dGlvbiwKICBgR3JvdXAgRXhjaGFuZ2VgOmBJbmRpdmlkdWFsX0V4Y2hhbmdlYCkKCmdncGxvdCgKICBkZiAlPiUgZmlsdGVyKAogICAgVHlwZSA9PSAnR3JvdXAgRXhjaGFuZ2UnCiAgKSwgCiAgYWVzKAogICAgeCA9IGZhY3RvcihSb3VuZCksCiAgICB5ID0gQ29udHJpYnV0aW9uCiAgICAKICApCikgKyBnZW9tX2JveHBsb3QoKSArCiAgbGFicygKICAgIHggPSAiUm91bmQiLAogICAgeSA9ICJQdWJsaWMgR29vZCBDb250cmlidXRpb24sIFBlcmNlbnQiLCAKICAgIHRpdGxlID0gIlB1YmxpYyBHb29kIENvbnRyaWJ1dGlvbiBSYXRlcyBPdmVyIFNlc3Npb24gUm91bmRzIiwKICAgIHN1YnRpdGxlID0gInF1YXJ0aWxlIGJveHBsb3QsIHRlbiByb3VuZHMgcGVyIHNlc3Npb24iCiAgKSArCiAgZmFjZXRfZ3JpZChNUENSfi4pICsKICB0aGVtZV9idygpCgpgYGAKClN1YmplY3RzIHBsYXllZCB0ZW4gVkNNIHJvdW5kcy4gQXMgcm91bmRzIHByb2dyZXNzZWQsIHJhdGVzIG9mIHB1YmxpYyBnb29kcyBjb250cmlidXRpb24gZGVjbGluZWQuIAoKCmBgYHtyLCBlY2hvID0gRkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGZpZy5oZWlnaHQ9My41LCBmaWcud2lkdGg9NS41fQoKZ2dwbG90KAogIGRmICU+JSBmaWx0ZXIoCiAgICBUeXBlID09ICdHcm91cCBFeGNoYW5nZScKICApLCAKICBhZXMoCiAgICB4ID0gUm91bmQsCiAgICB5ID0gQ29udHJpYnV0aW9uLAogICAgZ3JvdXAgPSBNUENSLCBjb2xvciA9IE1QQ1IKICAgIAogICkKKSArIGdlb21fc21vb3RoKHNwYW4gPSAwLjc1KSArCiAgbGFicygKICAgIHggPSAiUm91bmQiLAogICAgeSA9ICJQdWJsaWMgR29vZCBDb250cmlidXRpb24sIFBlcmNlbnQiLCAKICAgIHRpdGxlID0gIiAiLAogICAgY2FwdGlvbiA9ICJTaW1wbGUgTE9FU1MgU21vb3RoZXIsIHNwYW4gPSAwLjc1IgogICkgKwogIHRoZW1lX21pbmltYWwoKQoKCmBgYAoKCkNvbXBhcmluZyBiZXR3ZWVuIE1QQ1JzLCB0aGUgaGlnaGVyIHJhdGVzIGdlbmVyYWxseSBoYWQgYXBwcm94aW1hdGVseSAxMCUgaGlnaGVyIHB1YmxpYyBnb29kIGNvbnRyaWJ1dGlvbiByYXRlcyBvbiBhdmVyYWdlLiAKCgpgYGB7ciwgZWNobyA9IEZBTFNFLCBtZXNzYWdlPUZBTFNFLCBmaWcuaGVpZ2h0PTQsIGZpZy53aWR0aD02LjV9CgpkZiA9IFZDTSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgZ3JvdXBfYnkoc2Vzc2lvbi5jb2RlLCBzdWJzZXNzaW9uLnJvdW5kX251bWJlciwgZ3JvdXAuaWRfaW5fc3Vic2Vzc2lvbikgJT4lCiAgc3VtbWFyaXNlKAogICAgUm91bmQgPSB1bmlxdWUoc3Vic2Vzc2lvbi5yb3VuZF9udW1iZXIpLAogICAgR3JvdXBfRXhjaGFuZ2VfVG90YWwgPSBzdW0ocGxheWVyLmdyb3VwX2V4Y2hhbmdlKSwKICAgIEdyb3VwX0V4Y2hhbmdlX0F2Z1ByY3QgPSBtZWFuKHBsYXllci5ncm91cF9leGNoYW5nZV9wZXJjZW50KSwKICAgIEVuZG93bWVudF9Ub3RhbCA9IHN1bShwbGF5ZXIuZ3JvdXBfZXhjaGFuZ2UpICsgc3VtKHBsYXllci5pbmRpdmlkdWFsX2V4Y2hhbmdlKSwKICAgIE1QQ1IgPSB1bmlxdWUocGxheWVyLm1wY3IpCiAgKQoKcDE9IGdncGxvdCgKICBkZiwgCiAgYWVzKAogICAgeCA9IFJvdW5kLAogICAgeSA9IEdyb3VwX0V4Y2hhbmdlX1RvdGFsLAogICAgZ3JvdXAgPSBmYWN0b3IoTVBDUiksIGNvbG9yID0gZmFjdG9yKE1QQ1IpCiAgICAKICApCikgCgojIHAxICsgZ2VvbV9zbW9vdGgoKSArCiMgICBsYWJzKAojICAgICB4ID0gIlJvdW5kIiwKIyAgICAgeSA9ICJQdWJsaWMgR29vZCBDb250cmlidXRpb24sIFRvdGFsIiwgCiMgICAgIHRpdGxlID0gIiAiLAojICAgICBjb2xvciA9ICJNUENSIgojICAgKSArCiMgICB0aGVtZV9idygpCgpnZ3Bsb3QoCiAgZGYsIAogIGFlcygKICAgIHggPSBSb3VuZCwKICAgIHkgPSBHcm91cF9FeGNoYW5nZV9Ub3RhbCwKICAgIGdyb3VwID0gUm91bmQsIGNvbG9yID0gZmFjdG9yKE1QQ1IpCiAgICAKICApCikgICsgZ2VvbV9ib3hwbG90KCkgKwogIGxhYnMoCiAgICB4ID0gIlJvdW5kIiwKICAgIHkgPSAiUHVibGljIEdvb2QgQ29udHJpYnV0aW9uLCBUb3RhbCIsIAogICAgdGl0bGUgPSAiICIsCiAgICBzdWJzdGl0bGUgPSAiUXVhcnRpbGUgYm94cGxvdCBvZiB0b3RhbCBwdWJsaWMgZ29vZCBjb250cmlidXRpb24iLAogICAgY29sb3IgPSAiTVBDUiIKICApICsKICB0aGVtZV9saWdodCgpICsKICBmYWNldF9ncmlkKE1QQ1J+LikKCgpgYGAKCgpgYGB7ciwgZWNobyA9IEZBTFNFLCBtZXNzYWdlPUZBTFNFLCBmaWcuaGVpZ2h0PTQsIGZpZy53aWR0aD01LjV9CgpkZiA9IFZDTSAlPiUKICBzZWxlY3QoCiAgICBSb3VuZCA9IHN1YnNlc3Npb24ucm91bmRfbnVtYmVyLAogICAgR3JvdXBfRXhjaGFuZ2UgPSBwbGF5ZXIuZ3JvdXBfZXhjaGFuZ2VfcGVyY2VudCwgCiAgICBQbGF5ZXIgPSBwYXJ0aWNpcGFudC5jb2RlLAogICAgZXZlcnl0aGluZygpCiAgKSAlPiUKICBmaWx0ZXIoCiAgICAhaXMubmEoR3JvdXBfRXhjaGFuZ2UpCiAgKQoKZGYgPSBsZWZ0X2pvaW4oCiAgZGYsIAogIHN0YWdlICU+JSBkcGx5cjo6c2VsZWN0KAogICAgUGxheWVyID0gcGFydGljaXBhbnQuY29kZSwgcGxheWVyLnBsYXllcl9yb2xlCiAgKSwKICBieSA9ICJQbGF5ZXIiCikKCmdncGxvdCgKICBkZiwgCiAgYWVzKAogICAgeCA9IEdyb3VwX0V4Y2hhbmdlLCAKICAgIGdyb3VwID0gUGxheWVyCiAgKQopICsKICBzdGF0X2VjZGYoYWxwaGEgPSAuNCwgc2l6ZSA9IDEuMikgKwogIHhsaW0oMCwxLjApICsKICB0aGVtZV9taW5pbWFsKCkgKwogIGxhYnMoCiAgICB5ID0gIkN1bXVsYXRpdmUgUHJvYmFiaWxpdHkiLAogICAgeCA9ICJHcm91cCBFeGNoYW5nZSBDb250cmlidXRpb24sIGxpbWl0IFswLjA1LDAuOTVdIiwKICAgIHRpdGxlID0gIkVDREYgb2YgUGxheWVyIEdyb3VwIEV4Y2hhbmdlLCBPdmVyIEFsbCBSb3VuZHMiCiAgKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikKCmBgYAoKCmBgYHtyLCBlY2hvID0gRkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGZpZy5oZWlnaHQ9NCwgZmlnLndpZHRoPTUuNX0KCmdncGxvdCgKICBkZiAlPiUKICAgIGdyb3VwX2J5KFBsYXllcikgJT4lCiAgICBzdW1tYXJpc2UoCiAgICAgIEdFX2NvbnQgPSBtZWFuKEdyb3VwX0V4Y2hhbmdlKSwKICAgICAgVHJlYXRtZW50ID0gZmFjdG9yKHVuaXF1ZShwbGF5ZXIubXBjcikpCiAgICApLCAKICBhZXMoCiAgICB4ID0gR0VfY29udCwKICAgIGdyb3VwID0gVHJlYXRtZW50LCBjb2xvcj1UcmVhdG1lbnQsIGZpbGw9VHJlYXRtZW50CiAgKQopICsKICBnZW9tX2RlbnNpdHkoYWxwaGEgPSAuNSkgKwogICMgeGxpbSgwLDEwMCkgKwogIHRoZW1lX21pbmltYWwoKSAgKwogIGxhYnMoCiAgICB5ID0gIkRlbnNpdHkiLAogICAgeCA9ICJHcm91cCBFeGNoYW5nZSBDb250cmlidXRpb24sIGxpbWl0IFswLjA1LDAuOTVdIiwKICAgIHRpdGxlID0gIkRpc3RyaWJ1dGlvbiBvZiBHcm91cCBFeGNoYW5nZSBDb250cmlidXRpb25zIiwKICAgIGZpbGwgPSAiTVBDUiIsIGNvbG9yID0gIk1QQ1IiCiAgKQoKCgoKYGBgCgpgYGB7ciwgZWNobyA9IEZBTFNFLCBtZXNzYWdlPUZBTFNFLCBmaWcuaGVpZ2h0PTQsIGZpZy53aWR0aD01LjV9CgpkZiA9IHN0YWdlICU+JQogIGZpbHRlcihzdWJzZXNzaW9uLnJvdW5kX251bWJlciA9PSAxKSAlPiUKICBzZWxlY3QoCiAgICBHcm91cF9FeGNoYW5nZV9QZXJjZW50ID0gcGxheWVyLnZjbV9nZV9wZXJjZW50LAogICAgUm9sZSA9IHBsYXllci5wbGF5ZXJfcm9sZSkKCmdncGxvdCgKICBkZiwgCiAgYWVzKAogICAgeCA9IEdyb3VwX0V4Y2hhbmdlX1BlcmNlbnQgIAogICAgKQopICsgCiAgZ2VvbV9kZW5zaXR5KGFscGhhID0gMC45LCBmaWxsID0gMC41LCBjb2xvciA9ICJibGFjayIKICAgICAgICAgICAgICAgKSArIAogIGxhYnMoCiAgICB4ID0gIkdyb3VwIEV4Y2hhbmdlIENvbnRyaWJ1dGlvbiBhcyBQZXJjZW50IG9mIEVuZG93bWVudCIsCiAgICB0aXRsZSA9ICJEaXN0cmlidXRpb24gb2YgUHVibGljIEdvb2QgQ29udHJpYnV0aW9ucyxcbmJ5IFBlcmNlbnQgb2YgRW5kb3dtZW50IgogICkKCmBgYAoKCmBgYHtyLCBlY2hvID0gRkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGZpZy5oZWlnaHQ9NCwgZmlnLndpZHRoPTUuNX0KCmdncGxvdCgKICBkZiwgCiAgYWVzKAogICAgeCA9IEdyb3VwX0V4Y2hhbmdlX1BlcmNlbnQgLAogICAgY29sb3IgPSBSb2xlLCBmaWxsID0gUm9sZQogICkKKSArIAogIGdlb21fZGVuc2l0eShhbHBoYSA9IDAuMikrICAKICBsYWJzKAogICAgeCA9ICJHcm91cCBFeGNoYW5nZSBDb250cmlidXRpb24gYXMgUGVyY2VudCBvZiBFbmRvd21lbnQiLAogICAgdGl0bGUgPSAiRGlzdHJpYnV0aW9uIG9mIFB1YmxpYyBHb29kIENvbnRyaWJ1dGlvbnMsXG5ieSBQZXJjZW50IG9mIEVuZG93bWVudCwgYnkgUm9sZSIKICApICsKICB0aGVtZV9taW5pbWFsKCkKCgoKYGBgCgoKCmBgYHtyLCBlY2hvID0gRkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGZpZy5oZWlnaHQ9NCwgZmlnLndpZHRoPTYuNX0KIyBGaXJzdCBkb3QgZ3JhcGgKCgpkZiA9IFZDTSAlPiUKICBzZWxlY3QoCiAgICBSb3VuZCA9IHN1YnNlc3Npb24ucm91bmRfbnVtYmVyLAogICAgR3JvdXBfRXhjaGFuZ2UgPSBwbGF5ZXIuZ3JvdXBfZXhjaGFuZ2VfcGVyY2VudCwgCiAgICBQbGF5ZXIgPSBwYXJ0aWNpcGFudC5jb2RlLAogICAgZXZlcnl0aGluZygpCiAgKSAlPiUKICBmaWx0ZXIoCiAgICAhaXMubmEoR3JvdXBfRXhjaGFuZ2UpCiAgKSAlPiUKICBncm91cF9ieShQbGF5ZXIpICU+JQogIHN1bW1hcmlzZSgKICAgIEdyb3VwX0V4Y2hhbmdlID0gbWVhbihHcm91cF9FeGNoYW5nZSkKICApCgpkZiA9IGxlZnRfam9pbigKICBzdGFnZSwgZGYsCiAgYnkgPSBjKCJwYXJ0aWNpcGFudC5jb2RlIiA9ICJQbGF5ZXIiKQopICU+JQogIHNlbGVjdCgKICAgIHBhcnRpY2lwYW50LmlkX2luX3Nlc3Npb246cGxheWVyLnZjbV9nZV9wZXJjZW50LAogICAgR3JvdXBfRXhjaGFuZ2UsCiAgICBldmVyeXRoaW5nKCkKICApCgojIGNsZWFuIHVwIG5hbWluZyBvZiBncm91cHMgaW4gcGFzdGUoc2Vzc2lvbi5jb2RlLGdyb3VwLmlkX2luX3N1YnNlc3Npb24pCmRmID0gZGYgJT4lCiAgbXV0YXRlKAogICAgU2Vzc2lvbiA9IGFzLmZhY3RvcihzZXNzaW9uLmNvZGUpLAogICAgU2Vzc2lvbiA9IGFzLm51bWVyaWMoU2Vzc2lvbiksCiAgICBJRCA9IHBhc3RlKCJTIixTZXNzaW9uLCJHIiwgc2VwPSIiKSwKICAgIElEID0gc3ByaW50ZihwYXN0ZShJRCwnJTAyZCcsIHNlcD0iIiksIGdyb3VwLmlkX2luX3N1YnNlc3Npb24pIAogICkKICAKZGYgPSBkZiAlPiUKICBkaXN0aW5jdChTZXNzaW9uLCBJRCwgR3JvdXBfRXhjaGFuZ2UscGxheWVyLnBsYXllcl9yb2xlLCAua2VlcF9hbGwgPSBUUlVFKQoKCmdncGxvdCgKICBkYXRhID0gZGYsCiAgYWVzKAogICAgeCA9IElELCAKICAgIHkgPSBHcm91cF9FeGNoYW5nZSwKICAgIGNvbG9yID0gcGxheWVyLnBsYXllcl9yb2xlCiAgICAgICkKKSArCiAgZ2VvbV9wb2ludCgKICAgIHNpemUgPSA4LCBhbHBoYSA9IC41CiAgICAgICkgKwogIHlsaW0oMCwuOTYpICsKICB4bGFiKCJQYWlyIikgKwogIHlsYWIoIkdyb3VwIEV4Y2hhbmdlIENvbnRyaWJ1dGlvbiIpICsgCiAgbGFicyh0aXRsZSA9ICJBdmVyYWdlIEdyb3VwIEV4Y2hhbmdlIGZyb20gVkNNIikgKyAKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKyAKICBzY2FsZV9jb2xvcl9kaXNjcmV0ZShuYW1lPSJSb2xlIG9mIFBsYXllciIsCiAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtzPWMoIkEiLCAiRiIpLAogICAgICAgICAgICAgICAgICAgICAgIGxhYmVscz1jKCJBY3RpdmlzdCIsICJGaXJtIikpICsKICB0aGVtZShsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMiwgZmFjZT0iYm9sZCIpKSArCiAgdGhlbWVfbWluaW1hbChiYXNlX3NpemUgPSAxMSwgYmFzZV9mYW1pbHkgPSAiIikgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUpKQogIAogIApgYGAKCgpgYGB7ciwgZWNobyA9IEZBTFNFLCBldmFsPSBGQUxTRSwgbWVzc2FnZT1GQUxTRSwgZmlnLmhlaWdodD00LCBmaWcud2lkdGg9NS41fQoKZ2dwbG90KAogIGRhdGEgPSBkZiwKICBhZXMoCiAgICB4ID0gSUQsIAogICAgeSA9IHBsYXllci52Y21fc2NvcmUsCiAgICBjb2xvciA9IHBsYXllci5wbGF5ZXJfcm9sZQogICAgICApCikgKwogIGdlb21fcG9pbnQoCiAgICBzaXplID0gMTAsIGFscGhhID0gLjUKICAgICAgKSArCiAgeGxhYigiUGFpciIpICsKICB5bGFiKCJQYXlvZmYgRnJvbSBWQ00gUm91bmQiKSArIAogIGxhYnModGl0bGUgPSAiVkNNIFJvdW5kIFBheW9mZnMgZm9yIEFjdGl2aXN0cyBhbmQgRmlybXMiKSArIAogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSArIAogIHNjYWxlX2NvbG9yX2Rpc2NyZXRlKG5hbWU9IlJvbGUgb2YgUGxheWVyIiwKICAgICAgICAgICAgICAgICAgICAgICBicmVha3M9YygiQSIsICJGIiksCiAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzPWMoIkFjdGl2aXN0IiwgIkZpcm0iKSkgKwogIHRoZW1lKGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTEyLCBmYWNlPSJib2xkIikpICsKICB0aGVtZV9idyhiYXNlX3NpemUgPSAxMSwgYmFzZV9mYW1pbHkgPSAiIikKCgoKZ2dwbG90KAogIGRhdGEgPSBkZiwKICBhZXMoCiAgICB4ID0gSUQsIAogICAgeSA9IHBsYXllci52Y21fc2NvcmUsCiAgICBjb2xvciA9IHBsYXllci5wbGF5ZXJfcm9sZSwKICAgIGF4aXMoMSwgbGFiZWxzID0gRkFMU0UpCiAgICAgICkKKSArCiAgZ2VvbV9wb2ludCgKICAgIHNpemUgPSAxMCwgYWxwaGEgPSAuNQogICAgICApICsKICB4bGFiKCJQYWlyIikgKwogIHlsYWIoIlN0YWdlIEdhbWUgQmFzZSBQb2ludHMiKSArIAogIGxhYnModGl0bGUgPSAiQmFzZSBQb2ludHMgZm9yIEFjdGl2aXN0cyBhbmQgRmlybXMiLAogIHN1YnRpdGxlID0gIlNjb3JlIGZyb20gQTEgYW5kIEEzIE5vZGVzLCBpLmUuIHdpdGggbm8gY2hhbmdlIHRvIEdFIikgKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSArIAogIHNjYWxlX2NvbG9yX2Rpc2NyZXRlKG5hbWU9IlJvbGUgb2YgUGxheWVyIiwKICAgICAgICAgICAgICAgICAgICAgICBicmVha3M9YygiQSIsICJGIiksCiAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzPWMoIkFjdGl2aXN0IiwgIkZpcm0iKSkgKwogIHRoZW1lKGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTEyLCBmYWNlPSJib2xkIikpICsKICB0aGVtZV9idyhiYXNlX3NpemUgPSAxMSwgYmFzZV9mYW1pbHkgPSAiIikKCmdncGxvdCgKICBkYXRhID0gZGYsCiAgYWVzKAogICAgeCA9IElELCAKICAgIHkgPSBwbGF5ZXIucG9zdFN0YWdlX3JvdW5kX3BvaW50cywKICAgIGNvbG9yID0gcGxheWVyLnBsYXllcl9yb2xlCiAgICAgICkKKSArCiAgZ2VvbV9wb2ludCgKICAgIHNpemUgPSAxMCwgYWxwaGEgPSAuNQogICAgICApICsKICB4bGFiKCJQYWlyIikgKwogIHlsYWIoIlBheW9mZiBmcm9tIFN0YWdlIEdhbWUiKSArIAogIGxhYnModGl0bGUgPSAiU3RhZ2UgR2FtZSBQYXlvZmZzIGZvciBBY3RpdmlzdHMgYW5kIEZpcm1zIikgKyAKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKyAKICBzY2FsZV9jb2xvcl9kaXNjcmV0ZShuYW1lPSJSb2xlIG9mIFBsYXllciIsCiAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtzPWMoIkEiLCAiRiIpLAogICAgICAgICAgICAgICAgICAgICAgIGxhYmVscz1jKCJBY3RpdmlzdCIsICJGaXJtIikpICsKICB0aGVtZShsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMiwgZmFjZT0iYm9sZCIpKSArCiAgdGhlbWVfYncoYmFzZV9zaXplID0gMTEsIGJhc2VfZmFtaWx5ID0gIiIpCiAgCgoKYGBgCgoKIyMgU3RhZ2UgR2FtZQoKCmBgYHtyLCBlY2hvID0gRn0KIyAjIG11c3QgYmUgaGlkZGVuIHdoZW4gY29tcGlsaW5lLiAKIyAKIyBsaWJyYXJ5KGQzVHJlZSkKIyBkdHJlZSA9IGRhdGEuZnJhbWUoCiMgICBOb2RlMSAgPSBjKCdBMScsJ0ExJywnQTInLCdBMicsJ0EyJywnQTInLCdBMicsJ0EyJywnQTInLCdBMicpLAojICAgTm9kZTIgID0gYygnUm9sZSBBIFBheW9mZjogMScsJ1JvbGUgRiBQYXlvZmY6IDInLCAnRjEnLCdGMScsJ0YyJywnRjInLCdGMicsJ0YyJywnRjInLCdGMicpLAojICAgTm9kZTMgID0gYyggTkEsICBOQSwnUm9sZSBBIFBheW9mZjogMScsJ1JvbGUgRiBQYXlvZmY6IDInLCAnQTMnLCdBMycsJ0E0JywnQTQnLCdBNCcsJ0E0JyksCiMgICBOb2RlNCAgPSBjKCBOQSwgIE5BLE5BLE5BLCdSb2xlIEEgUGF5b2ZmOiAxJywnUm9sZSBGIFBheW9mZjogMicsICdOMScsJ04xJywnTjInLCdOMicpLAojICAgUEFZT0ZGUyA9IGMoTkEsTkEsTkEsTkEsTkEsTkEsJ1JvbGUgQSBQYXlvZmY6IDEnLCdSb2xlIEYgUGF5b2ZmOiAyJywnUm9sZSBBIFBheW9mZjogMScsJ1JvbGUgRiBQYXlvZmY6IDInKSwKIyAgIE5vZGU1ICA9IGMoIE5BLE5BLE5BLE5BLE5BLE5BLE5BLE5BLE5BLE5BKQojICkKIyAgIGQzdHJlZShsaXN0KHJvb3QgPSBkZjJ0cmVlKHJvb3RuYW1lID0gJ1N0YWdlIEdhbWUnLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0ID0gZHRyZWUpLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5b3V0ID0gJ2NhcnRlc2lhbicpKQpgYGAKCgpUcmVhdG1lbnQgc3ViamVjdCBzdW1tYXJ5IHRhYmxlcwoKCgpCZWxvdywgcmVwb3J0cyB0aGUgb3ZlcmFsbCBwZXJjZW50IGVhY2ggdGVybWluYWwgbm9kZSBjaG9pY2Ugd2FzIHNlbGVjdGVkIGJ5IHN0YWdlIGdhbWUgZ3JvdXBzLiBOdW1iZXIgb2YgZ3JvdXBzIGFyZSB0aGUgbnVtYmVycyBiZWxvdyBkaXZpZGVkIGJ5IHR3by4gCgpgYGB7ciwgZWNobz1GQUxTRSwgZmlnLmhlaWdodD0zLjUsIGZpZy53aWR0aD01LjUsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGVycm9yPUZBTFNFfQoKZGYgPSBzdGFnZSAlPiUKICBkcGx5cjo6ZGlzdGluY3QocGFydGljaXBhbnQuY29kZSwgc2Vzc2lvbi5jb2RlLCBwbGF5ZXIubXBjcikgJT4lCiAgZHBseXI6Omdyb3VwX2J5KHBsYXllci5tcGNyKSAlPiUKICBkcGx5cjo6c3VtbWFyaXNlKG49bigpKQoKa2FibGUoCiAgZm9ybWF0ID0gInBhbmRvYyIsCiAgYWxpZ24gPSAnYycsCiAgY29sLm5hbWVzID0gYygnTVBDUicsJ04gU3ViamVjdHMnKSwKICBkZgopCgoKYGBgCgpgYGB7ciwgZWNobz1GQUxTRSwgZmlnLmhlaWdodD0zLjUsIGZpZy53aWR0aD01LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBlcnJvcj1GQUxTRX0KCgpkZiA9IHN0YWdlICU+JQogICMgZGlzdGluY3QoCiAgIyAgIGdyb3VwLmlkX2luX3N1YnNlc3Npb24sIHN1YnNlc3Npb24ucm91bmRfbnVtYmVyLCBrZWVwX2FsbCA9IFRSVUUKICAjICkgICU+JQogIG11dGF0ZShwbGF5ZXIudGVybWluYWxfY2hvaWNlID0gaWZlbHNlKHBsYXllci50ZXJtaW5hbF9jaG9pY2UgJWluJSBjKCJOMSIsIk4yIiksICJOYXR1cmUiLCBwbGF5ZXIudGVybWluYWxfY2hvaWNlKSkgJT4lIApmaWx0ZXIoIWlzLm5hKHBsYXllci50ZXJtaW5hbF9jaG9pY2UpKSU+JQogIGdyb3VwX2J5KHBsYXllci50ZXJtaW5hbF9jaG9pY2UsIHN1YnNlc3Npb24ucm91bmRfbnVtYmVyKSAlPiUKICBzdW1tYXJpc2UoCiAgICB2YWx1ZSA9IG4oKS8yCiAgKQoKCmRmJHBsYXllci50ZXJtaW5hbF9jaG9pY2UgPSBmYWN0b3IoCiAgZGYkcGxheWVyLnRlcm1pbmFsX2Nob2ljZSwKICBsZXZlbHMgPSBjKCJBMSIsIkYxIiwiQTMiLCJOYXR1cmUiKQopCgp6ZXJvX29iX25vZGVzID0gIGxldmVscyhkZiRwbGF5ZXIudGVybWluYWxfY2hvaWNlKVshKGxldmVscyhkZiRwbGF5ZXIudGVybWluYWxfY2hvaWNlKSAlaW4lIGRmJHBsYXllci50ZXJtaW5hbF9jaG9pY2UpXQogIApkZiA9IGJpbmRfcm93cygKICBkZiwKICBkYXRhLmZyYW1lKAogICAgcGxheWVyLnRlcm1pbmFsX2Nob2ljZSA9IGZhY3RvcigKICAgICAgemVyb19vYl9ub2RlcywKICAgICAgbGV2ZWxzID0gYygiQTEiLCJGMSIsIkEzIiwiTmF0dXJlIikKICAgICksCiAgICB2YWx1ZSA9IHJlcCgwLGxlbmd0aCh6ZXJvX29iX25vZGVzKSkKICApCikKCgpkZjIgPSBkZiAlPiUgZ3JvdXBfYnkocGxheWVyLnRlcm1pbmFsX2Nob2ljZSkgJT4lIAogIHN1bW1hcmlzZSgKICAgIHZhbHVlID0gc3VtKHZhbHVlKQogICkgJT4lCiAgdW5ncm91cCgpICU+JQogIG11dGF0ZSggCiAgICBUb3RhbCA9IHN1bSh2YWx1ZSksIAogICAgdmFsdWVfcGVyY2VudCA9ICgxMDAgKiB2YWx1ZSAvIFRvdGFsKSAlPiUgcm91bmQoMSkgJT4lIGFzLmNoYXJhY3RlcigpLAogICAgdmFsdWVfcGVyY2VudCA9IHBhc3RlKHZhbHVlX3BlcmNlbnQsICIlIiwgc2VwID0gIiIpCiAgKQpnZ3Bsb3QoCiAgZGYyLCAKICBhZXMoCiAgICB4ID0gKHBsYXllci50ZXJtaW5hbF9jaG9pY2UpLAogICAgeSA9IHZhbHVlCiAgKQopICsKICBzY2FsZV94X2Rpc2NyZXRlKGRyb3AgPSBGQUxTRSkgKyAKICBnZW9tX2Jhcihjb2xvdXIgPSAiYmxhY2siLHBvc2l0aW9uID0gImRvZGdlIixzdGF0ID0gImlkZW50aXR5IikgKwogIGdlb21fdGV4dChhZXMobGFiZWwgPSB2YWx1ZV9wZXJjZW50KSwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IC44KSwgdmp1c3QgPSAtMC41KSArCiAgeWxpbSgwLG1heChkZjIkdmFsdWUpICogMS4wNykgKwogIGxhYnMoCiAgICB4ID0gIlRlcm1pbmFsIE5vZGUiLAogICAgeSA9ICJQZXJjZW50IiwgCiAgICB0aXRsZSA9ICJUZXJtaW5hbCBOb2RlIENob2ljZSwgUGVyY2VudCBGcmVxdWVuY3kiCiAgKSArCiAgdGhlbWVfbWluaW1hbCggICkgKwogIHRoZW1lKAogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpCiAgKQoKCmBgYAoKCkJlbG93LCByZXBvcnRzIGhvdyB0ZXJtaW5hbCBub2RlIGNob2ljZXMgZXZvbHZlZCBhcyB0aGUgc2Vzc2lvbiBwcm9ncmVzc2VkIG92ZXIgZWFjaCBvZiB0ZW4gcm91bmRzLiAKCkdyb3VwcyBpbiB0aGUgc3RhZ2UgZ2FtZSB3ZXJlIGZpeGVkLiAKCgpgYGB7ciwgZWNobyA9IEZBTFNFLCBtZXNzYWdlPUZBTFNFLCBmaWcuaGVpZ2h0PTQsIGZpZy53aWR0aD02LjUsIHdhcm5pbmc9RkFMU0UsIGVycm9yPUZBTFNFfQojcmVxdWlyZXMgZGYgY3JlYXRlZCBhYm92ZQpnZ3Bsb3QoCiAgZGYsCiAgYWVzKAogICAgeCA9IHN1YnNlc3Npb24ucm91bmRfbnVtYmVyLAogICAgeSA9IHZhbHVlLAogICAgZ3JvdXAgPSBwbGF5ZXIudGVybWluYWxfY2hvaWNlLAogICAgZmlsbCA9IHBsYXllci50ZXJtaW5hbF9jaG9pY2UKICApCikgKyAKICBnZW9tX2FyZWEocG9zaXRpb249ImZpbGwiLCBhbHBoYSA9IDAuNjYpICsKICAgIGxhYnMoCiAgICB4ID0gIlJvdW5kIiwKICAgIHkgPSAiUGVyY2VudCIsIAogICAgdGl0bGUgPSAiRnJlcXVlbmN5IG9mIFRlcm1pbmFsIE5vZGUgQ2hvaWNlIE92ZXIgUm91bmRzIiwKICAgIGZpbGwgPSAiVGVybWluYWwgTm9kZSIKICApICsKICB0aGVtZV9taW5pbWFsKCkKCmBgYAoKCkJlbG93LCBicmVha3MgZG93biB0ZXJtaW5hbCBub2RlIGNob2ljZSBkeW5hbWljcyBieSBNUENSIHRyZWF0bWVudC4gCgpgYGB7ciwgZWNobyA9IEZBTFNFLCBtZXNzYWdlPUZBTFNFLCBmaWcuaGVpZ2h0PTQsIGZpZy53aWR0aD02LjUsIHdhcm5pbmc9RkFMU0UsIGVycm9yPUZBTFNFfQoKZGYgPSBzdGFnZSAlPiUKICAjIGRpc3RpbmN0KAogICMgICBncm91cC5pZF9pbl9zdWJzZXNzaW9uLCBzdWJzZXNzaW9uLnJvdW5kX251bWJlciwga2VlcF9hbGwgPSBUUlVFCiAgIyApICAlPiUKICBtdXRhdGUocGxheWVyLnRlcm1pbmFsX2Nob2ljZSA9IGlmZWxzZShwbGF5ZXIudGVybWluYWxfY2hvaWNlICVpbiUgYygiTjEiLCJOMiIpLCAiTmF0dXJlIiwgcGxheWVyLnRlcm1pbmFsX2Nob2ljZSkpICU+JSAKZmlsdGVyKCFpcy5uYShwbGF5ZXIudGVybWluYWxfY2hvaWNlKSklPiUKICBncm91cF9ieShwbGF5ZXIudGVybWluYWxfY2hvaWNlLCBzdWJzZXNzaW9uLnJvdW5kX251bWJlciwgcGxheWVyLm1wY3IpICU+JQogIHN1bW1hcmlzZSgKICAgIHZhbHVlID0gbigpLzIKICApCgoKZGYkcGxheWVyLnRlcm1pbmFsX2Nob2ljZSA9IGZhY3RvcigKICBkZiRwbGF5ZXIudGVybWluYWxfY2hvaWNlLAogIGxldmVscyA9IGMoIkExIiwiRjEiLCJBMyIsIk5hdHVyZSIpCikKCiMgZml4IHRoaXMgbGF0ZXIhCmFsbCA9IGV4cGFuZC5ncmlkKHVubGlzdChsZXZlbHMoZGYkcGxheWVyLnRlcm1pbmFsX2Nob2ljZSkpLCB1bmlxdWUoZGYkc3Vic2Vzc2lvbi5yb3VuZF9udW1iZXIpLCB1bmlxdWUoZGYkcGxheWVyLm1wY3IpKQpuYW1lcyhhbGwpID0gYygncGxheWVyLnRlcm1pbmFsX2Nob2ljZScsICJzdWJzZXNzaW9uLnJvdW5kX251bWJlciIsICdwbGF5ZXIubXBjcicpCgp6ZXJvX29iX25vZGVzID0gIHNldGRpZmYoYWxsLCBkZltjKCdwbGF5ZXIudGVybWluYWxfY2hvaWNlJywgInN1YnNlc3Npb24ucm91bmRfbnVtYmVyIiwgJ3BsYXllci5tcGNyJyldKQogIAoKZGYgPSBiaW5kX3Jvd3MoCiAgZGYsCiAgICBkYXRhLmZyYW1lKAogICAgICB6ZXJvX29iX25vZGVzLCAKICAgIHZhbHVlID0gcmVwKDAsbnJvdyh6ZXJvX29iX25vZGVzKSkKICAgICkKICApCgoKZ2dwbG90KAogIGRmICU+JQogICAgbXV0YXRlKAogICAgICBwbGF5ZXIubXBjciA9IGlmZWxzZSgKICAgICAgICBwbGF5ZXIubXBjciA9PSAwLjMsIAogICAgICAgICJNUENSOiAwLjMiLCAiTVBDUjogMC43NSIKICAgICAgKQogICAgKSwKICBhZXMoCiAgICB4ID0gc3Vic2Vzc2lvbi5yb3VuZF9udW1iZXIsCiAgICB5ID0gdmFsdWUsCiAgICBncm91cCA9IHBsYXllci50ZXJtaW5hbF9jaG9pY2UsCiAgICBmaWxsID0gcGxheWVyLnRlcm1pbmFsX2Nob2ljZQogICkKKSArIAogIGdlb21fYXJlYShwb3NpdGlvbj0iZmlsbCIsIGFscGhhID0gMC42KSArCiAgICBsYWJzKAogICAgeCA9ICJSb3VuZCIsCiAgICB5ID0gIlBlcmNlbnQiLCAKICAgIGZpbGwgPSAiVGVybWluYWwgTm9kZSIsCiAgICB0aXRsZSA9ICJGcmVxdWVuY3kgb2YgVGVybWluYWwgTm9kZSBDaG9pY2UgT3ZlciBSb3VuZHMiCiAgKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICBmYWNldF9ncmlkKHBsYXllci5tcGNyfi4pCmBgYAoKClNlbGVjdGlvbnMgd2VyZSBlbGljaXRlZCB2aWEgdGhlIHN0cmF0ZWd5IG1ldGhvZC4gRm9yIGV4YW1wbGUsIGV2ZW4gaWYgQTEgd2FzIHNlbGVjdGVkIGJ5IHRoZSByb2xlIEEgcGxheWVyLCBSb2xlIEYgd291bGQgc3RpbGwgYmUgYXNrZWQgd2hhdCB0aGV5IHdvdWxkIGNob29zZSBpZiBBICpoYWQgY2hvc2VuIEEyKiBwcmV2aW91c2x5LiBBdCB0aGUgZW5kIG9mIGVhY2ggcm91bmQsIHRoZSB0ZXJtaW5hbCBub2RlIGFuZCBwYXlvZmZzIHdlcmUgcmV2ZWFsZWQgdG8gYm90aCBwbGF5ZXJzLiBBbmQgdGhlIG5leHQgcm91bmQgYmVnaW5zIHdpdGggdGhlIHN0cmF0ZWd5IG1ldGhvZCBhZ2Fpbi4KCkJlbG93IHJlcG9ydHMgdGhlIHBlcmNlbnQgb2YgdGltZSBlYWNoIGNob2ljZSB3YXMgc2VsZWN0ZWQgYXQgZWFjaCBkZWNpc2lvbi4gCgpOYXR1cmUgd2FzIHNlbGVjdGVkIGJ5IGEgcmFuZG9tIG51bWJlciBnZW5lcmF0ZWQgdmlhIHRoZSBleHBlcmltZW50IHNvZnR3YXJlLCB3aXRoIHByb2JhYmlsaXR5IG9mIE4xID0gMC43NS4KCgoKYGBge3IsIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9My41LCBmaWcud2lkdGg9NS41LCB3YXJuaW5nPUZBTFNFLCBlcnJvcj1GQUxTRX0KCmRmID0gc3RhZ2UgJT4lCiAgc2VsZWN0KAogICAgZ3JvdXAuaWRfaW5fc3Vic2Vzc2lvbiwKICAgIHBsYXllci50ZXJtaW5hbF9jaG9pY2UsCiAgICBwbGF5ZXIubXBjciwKICAgIGNvbnRhaW5zKCJfc3RhZ2UiKSwKICAgIGNvbnRhaW5zKCJOYXR1cmUiKQogICkKZGYgPSBkYXRhLmZyYW1lKAogIFNzX2RhdGEgPSBjKAogICAgZGYkcGxheWVyLkFfc3RhZ2UxLAogICAgZGYkcGxheWVyLkZfc3RhZ2UyLAogICAgZGYkcGxheWVyLkFfc3RhZ2UzLAogICAgZGYkcGxheWVyLk5hdHVyZVsxOihsZW5ndGgoZGYkcGxheWVyLk5hdHVyZSkvMildCiAgKQopICU+JQogIGZpbHRlcigKICAgICFpcy5uYShTc19kYXRhKQogICkgJT4lCiAgZ3JvdXBfYnkoU3NfZGF0YSkgJT4lCiAgc3VtbWFyaXNlKAogICAgbiA9IG4oKQogICkgJT4lCiAgbXV0YXRlKAogICAgTm9kZSA9ICJOMVxuTjIiLAogICAgTm9kZSA9IGlmZWxzZSgKICAgICAgdGVzdCA9IFNzX2RhdGEgJWluJSBjKCJBMSIsIkEyIiksCiAgICAgIHllcyA9ICJBMVxuQTIiLAogICAgICBubyA9IE5vZGUKICAgICksCiAgICBOb2RlID0gaWZlbHNlKAogICAgICB0ZXN0ID0gU3NfZGF0YSAlaW4lIGMoIkYxIiwiRjIiKSwKICAgICAgeWVzID0gIkYxXG5GMiIsCiAgICAgIG5vID0gTm9kZQogICAgKSwKICAgIE5vZGUgPSBpZmVsc2UoCiAgICAgIHRlc3QgPSBTc19kYXRhICVpbiUgYygiQTMiLCJBNCIpLAogICAgICB5ZXMgPSAiQTNcbkE0IiwKICAgICAgbm8gPSBOb2RlCiAgICApLAogICAgRGlyZWN0aW9uID0gaWZlbHNlKAogICAgICB0ZXN0ID0gU3NfZGF0YSAlaW4lIGMoIkExIiwiQTMiLCAiRjEiLCJOMSIpLAogICAgICB5ZXMgPSAi4oaRIiwKICAgICAgbm8gPSAi4oaTIgogICAgKQogICkKCmRmJE5vZGUgPSBmYWN0b3IoCiAgZGYkTm9kZSwgCiAgbGV2ZWxzID0gIGMoIkExXG5BMiIsIkYxXG5GMiIsIkEzXG5BNCIsICJOMVxuTjIiKQopCgpkZiA9IGRmICU+JQogIHVuZ3JvdXAoKSAlPiUKICBncm91cF9ieShOb2RlKSAlPiUKICBtdXRhdGUoCiAgICB0b3RhbCA9IHN1bShuKSwKICAgIHBlcmNlbnQgPSBuIC8gdG90YWwsCiAgICBwZXJjZW50X2NoYXIgPSBwYXN0ZSgoKDEwMCAqIG4gLyB0b3RhbCkgJT4lIHJvdW5kKDEpKSwgIiUiLCBzZXAgPSAiIikKICApCgojIFRoZSBwYWxldHRlIHdpdGggZ3JleToKY2JQYWxldHRlIDwtIGMoIiNlZmVmZWYiLCAiIzhjOGM4YyIsICIjNTZCNEU5IiwgIiMwMDlFNzMiLCAiI0YwRTQ0MiIsICIjMDA3MkIyIiwgIiNENTVFMDAiLCAiI0NDNzlBNyIpCgoKZ2dwbG90KAogIGRmLCAKICBhZXMoCiAgICB4ID0gTm9kZSwKICAgIHkgPSBwZXJjZW50LAogICAgZ3JvdXAgPSBEaXJlY3Rpb24sCiAgICBmaWxsID0gRGlyZWN0aW9uLAogICAgY29sb3VyID0gRGlyZWN0aW9uCiAgKQopICsKICBzY2FsZV94X2Rpc2NyZXRlKGRyb3AgPSBGQUxTRSkgKyAKICBnZW9tX2Jhcihwb3NpdGlvbiA9ICJzdGFjayIsc3RhdCA9ICJpZGVudGl0eSIpICsKICAjIGdlb21fdGV4dChhZXMobGFiZWwgPSB2YWx1ZSksIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAuOCksIHZqdXN0ID0gLTAuNSkgKwogICMgeWxpbSgwLG1heChkZiR2YWx1ZSkgKyAxKSArCiAgbGFicygKICAgIHggPSAiTm9kZSIsCiAgICB5ID0gIlBlcmNlbnQiLCAKICAgIHRpdGxlID0gIkZyZXF1ZW5jeSBvZiAgTm9kZSBDaG9pY2UiCiAgKSArCiAgdGhlbWVfbWluaW1hbCggICkgKwogIHRoZW1lKAogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpCiAgKSArCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXM9Y2JQYWxldHRlKSArCiAgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9Y2JQYWxldHRlKQoKCgoKYGBgCgoKVGhlIHBsb3QgYmVsb3cgYnJlYWtzIHRoZSBhYm92ZSBwbG90IGRvd24gYnkgTVBDUiB0cmVhdG1lbnQuIAoKCmBgYHtyLCBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTMuNSwgZmlnLndpZHRoPTYuNSwgd2FybmluZz1GQUxTRSwgZXJyb3I9RkFMU0V9CgpkZiA9IHN0YWdlICU+JQogIHNlbGVjdCgKICAgIGdyb3VwLmlkX2luX3N1YnNlc3Npb24sCiAgICBwbGF5ZXIudGVybWluYWxfY2hvaWNlLAogICAgcGxheWVyLm1wY3IsCiAgICBjb250YWlucygiX3N0YWdlIiksCiAgICBjb250YWlucygiTmF0dXJlIikKICApCmRmID0gZGF0YS5mcmFtZSgKICBTc19kYXRhID0gYygKICAgIGRmJHBsYXllci5BX3N0YWdlMSwKICAgIGRmJHBsYXllci5GX3N0YWdlMiwKICAgIGRmJHBsYXllci5BX3N0YWdlMywKICAgIGRmJHBsYXllci5OYXR1cmUKICApLAogIG1wY3IgPSBjKAogICAgZGYkcGxheWVyLm1wY3IsCiAgICBkZiRwbGF5ZXIubXBjciwKICAgIGRmJHBsYXllci5tcGNyLAogICAgZGYkcGxheWVyLm1wY3IKICApCikgJT4lCiAgZmlsdGVyKAogICAgIWlzLm5hKFNzX2RhdGEpCiAgKSAlPiUKICBncm91cF9ieShTc19kYXRhLG1wY3IpICU+JQogIHN1bW1hcmlzZSgKICAgIG4gPSBuKCkKICApICU+JQogIG11dGF0ZSgKICAgIE5vZGUgPSAiTjFcbk4yIiwKICAgIE5vZGUgPSBpZmVsc2UoCiAgICAgIHRlc3QgPSBTc19kYXRhICVpbiUgYygiQTEiLCJBMiIpLAogICAgICB5ZXMgPSAiQTFcbkEyIiwKICAgICAgbm8gPSBOb2RlCiAgICApLAogICAgTm9kZSA9IGlmZWxzZSgKICAgICAgdGVzdCA9IFNzX2RhdGEgJWluJSBjKCJGMSIsIkYyIiksCiAgICAgIHllcyA9ICJGMVxuRjIiLAogICAgICBubyA9IE5vZGUKICAgICksCiAgICBOb2RlID0gaWZlbHNlKAogICAgICB0ZXN0ID0gU3NfZGF0YSAlaW4lIGMoIkEzIiwiQTQiKSwKICAgICAgeWVzID0gIkEzXG5BNCIsCiAgICAgIG5vID0gTm9kZQogICAgKSwKICAgIERpcmVjdGlvbiA9IGlmZWxzZSgKICAgICAgdGVzdCA9IFNzX2RhdGEgJWluJSBjKCJBMSIsIkEzIiwgIkYxIiwiTjEiKSwKICAgICAgeWVzID0gIuKGkSIsCiAgICAgIG5vID0gIuKGkyIKICAgICksCiAgICBtcGNyID0gcGFzdGUoIk1QQ1I6IiwgbXBjcikKICApICU+JQogIGdyb3VwX2J5KG1wY3IsIE5vZGUpICU+JQogIG11dGF0ZSgKICAgIHRvdGFsID0gc3VtKG4pLAogICAgUGVyY2VudCA9IG4gLyB0b3RhbAogICAgICAgICApCiAgCiAgIyBncm91cCBieSBtcGNyIGFuZCBTc19kYXRhLCBnZXQgdG90YWwgb2YgY291bnQgd2l0aGluIGdyb3VwLCAKICAjIHRoZW4gZGl2aWQgbiBieSB0aGlzIG51bWJlciBmb3IgcGVyY2VudC4gCgpkZiROb2RlID0gZmFjdG9yKAogIGRmJE5vZGUsIAogIGxldmVscyA9ICBjKCJBMVxuQTIiLCJGMVxuRjIiLCJBM1xuQTQiLCAiTjFcbk4yIikKKQoKZ2dwbG90KAogIGRmLCAKICBhZXMoCiAgICB4ID0gTm9kZSwKICAgIHkgPSBQZXJjZW50LAogICAgZ3JvdXAgPSBEaXJlY3Rpb24sCiAgICBmaWxsID0gRGlyZWN0aW9uLAogICAgY29sb3VyID0gRGlyZWN0aW9uCiAgKQopICsKICBzY2FsZV94X2Rpc2NyZXRlKGRyb3AgPSBGQUxTRSkgKyAKICBnZW9tX2Jhcihwb3NpdGlvbiA9ICJzdGFjayIsc3RhdCA9ICJpZGVudGl0eSIpICsKICAjIGdlb21fdGV4dChhZXMobGFiZWwgPSB2YWx1ZSksIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAuOCksIHZqdXN0ID0gLTAuNSkgKwogICMgeWxpbSgwLG1heChkZiR2YWx1ZSkgKyAxKSArCiAgbGFicygKICAgIHggPSAiTm9kZSIsCiAgICB5ID0gIlBlcmNlbnQiLCAKICAgIHRpdGxlID0gIkZyZXF1ZW5jeSBvZiAgTm9kZSBDaG9pY2UiCiAgKSArCiAgdGhlbWVfbGlnaHQoICApICsKICB0aGVtZSgKICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KQogICkgKwogIGZhY2V0X2dyaWQofm1wY3IpICsKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcz1jYlBhbGV0dGUpICsKICAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jYlBhbGV0dGUpCgoKCgpgYGAKCgoKCgogCgoKCgpgYGB7ciwgZWNobyA9IEYsIGV2YWwgPSBGLCBtZXNzYWdlPUZBTFNFLCBmaWcuaGVpZ2h0PTEuNSwgZmlnLndpZHRoPTIuNX0KCmRmID0gVkNNICU+JQogIG11dGF0ZSgKICAgIFBsYXllciA9IGFzLmZhY3Rvcihyb3dfbnVtYmVyKCkpCiAgKSAlPiUKICBkcGx5cjo6ZmlsdGVyKCFpcy5uYShwbGF5ZXIuZ3JvdXBfZXhjaGFuZ2VfcGVyY2VudCkpICU+JQogIGRwbHlyOjpzZWxlY3QoCiAgICBwYXJ0aWNpcGFudC5jb2RlLAogICAgUGxheWVyLCAKICAgIGNvbnRhaW5zKCJncm91cF9leGNoYW5nZV9wZXJjZW50IikKICApICU+JQogIGdyb3VwX2J5KHBhcnRpY2lwYW50LmNvZGUpICU+JQogIHN1bW1hcml6ZSgKICAgIEdFX21lYW4gPSBtZWFuKHBsYXllci5ncm91cF9leGNoYW5nZV9wZXJjZW50LCBuYS5ybSA9IFQpLAogICAgbiA9IG4oKQogICkKCmRmID0gbGVmdF9qb2luKAogIGRmLCBzdGFnZSwKICBieSA9ICJwYXJ0aWNpcGFudC5jb2RlIgopICU+JQogIGRwbHlyOjpzZWxlY3QoR0VfbWVhbiwgcGxheWVyLnRlcm1pbmFsX2Nob2ljZSwgZ3JvdXAuaWRfaW5fc3Vic2Vzc2lvbiwgc2Vzc2lvbi5jb2RlLHN1YnNlc3Npb24ucm91bmRfbnVtYmVyLCBwbGF5ZXIubXBjcikgJT4lCiAgZ3JvdXBfYnkoZ3JvdXAuaWRfaW5fc3Vic2Vzc2lvbiwgc2Vzc2lvbi5jb2RlLCBzdWJzZXNzaW9uLnJvdW5kX251bWJlcikgJT4lCiAgc3VtbWFyaXNlKAogICAgdGVybWluYWxfbm9kZSA9IHVuaXF1ZShwbGF5ZXIudGVybWluYWxfY2hvaWNlKSwKICAgIEdFX2RpZmYgPSBhYnMoZGlmZihHRV9tZWFuKSkgJT4lIHJvdW5kKDIpLAogICAgbXBjciA9IHVuaXF1ZShwbGF5ZXIubXBjcikKICApICU+JQogIHNlbGVjdChzZXNzaW9uLmNvZGUsIGdyb3VwLmlkX2luX3N1YnNlc3Npb24sIHN1YnNlc3Npb24ucm91bmRfbnVtYmVyLCBtcGNyLCBHRV9kaWZmLCB0ZXJtaW5hbF9ub2RlKSAlPiUKICBtdXRhdGUodGVybWluYWxfbm9kZT1pZmVsc2UodGVybWluYWxfbm9kZSAlaW4lIGMoIk4xIiwiTjIiKSwiTmF0dXJlIix0ZXJtaW5hbF9ub2RlKSkgJT4lCiAgYXJyYW5nZSgtR0VfZGlmZixzdWJzZXNzaW9uLnJvdW5kX251bWJlciwgZGVzYyh0ZXJtaW5hbF9ub2RlKSkKCmthYmxlKGRmLAogICAgICBhbGlnbiA9ICdjJykKYGBgICAKCgpCZWxvdywgdGhlIHRhYmxlIHNob3dzIHRoZSBhdmVyYWdlIHJhdGVzIGF0IHdoaWNoIGVhY2ggTVBDUiB0cmVhdG1lbnQgZ3JvdXBzIHJlYWNoZWQgZWFjaCBwb3NzaWJsZSB0ZXJtaW5hbCBub2RlLgoKVGhlc2UgZ3JvdXBzIHdlcmUgY29tcG9zZWQgb2YgdHdvLXBsYXllcnMgaW4gdGVuIHJlcGVhdGVkIHJvdW5kcy4gV2UgZmluZCB0aGUgYXZlcmFnZSBudW1iZXIgb2YgdGltZXMgZWFjaCBncm91cCByZWFjaGVkIGVhY2ggcG9zc2libGUgdGVybWluYWwgbm9kZS4gVGhlcmUgd2VyZSBgciAgKHN0YWdlICU+JSBmaWx0ZXIocGxheWVyLm1wY3IgPT0gMC4zKSAlPiUgc3VtbWFyaXNlKG4gPWxlbmd0aCh1bmlxdWUocGFzdGUoc2Vzc2lvbi5jb2RlLCBncm91cC5pZF9pbl9zdWJzZXNzaW9uKSkpKSkkbmAgc3VjaCBncm91cHMgIGluIHRoZSBgTVBDUiA9IDAuM2AgdHJlYXRtZW50LCAKYW5kIGByICAoc3RhZ2UgJT4lIGZpbHRlcihwbGF5ZXIubXBjciA9PSAwLjc1KSAlPiUgc3VtbWFyaXNlKG4gPWxlbmd0aCh1bmlxdWUocGFzdGUoc2Vzc2lvbi5jb2RlLCBncm91cC5pZF9pbl9zdWJzZXNzaW9uKSkpKSkkbmAgc3VjaCBncm91cHMgIGluIHRoZSBgTVBDUiA9IDAuNzVgIHRyZWF0bWVudCByZWdpbWUuIAoKVGhlIHRhYmxlIGlzIGFycmFuZ2VkIHRvIG1ha2UgaXQgZWFzeSB0byBjb21wYXJlIHRlcm1pbmFsIG5vZGUgcmF0ZXMgYmV0d2VlbiBNUENSIHJlZ2ltZXMuIAoKYGBge3IsIGVjaG8gPSBGQUxTRSwgbWVzc2FnZT1GQUxTRSwgZmlnLmhlaWdodD0yLjUsIGZpZy53aWR0aD00LjUsIGVycm9yPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBjYWNoZT1GQUxTRX0KCmRmID0gVkNNICU+JQogIG11dGF0ZSgKICAgIFBsYXllciA9IGFzLmZhY3Rvcihyb3dfbnVtYmVyKCkpCiAgKSAlPiUKICBkcGx5cjo6ZmlsdGVyKCFpcy5uYShwbGF5ZXIuZ3JvdXBfZXhjaGFuZ2VfcGVyY2VudCkpICU+JQogIGRwbHlyOjpzZWxlY3QoCiAgICBwYXJ0aWNpcGFudC5jb2RlLAogICAgUGxheWVyLCAKICAgIGNvbnRhaW5zKCJncm91cF9leGNoYW5nZV9wZXJjZW50IikKICApICU+JQogIGdyb3VwX2J5KHBhcnRpY2lwYW50LmNvZGUpICU+JQogIHN1bW1hcml6ZSgKICAgIEdFX21lYW4gPSBtZWFuKHBsYXllci5ncm91cF9leGNoYW5nZV9wZXJjZW50LCBuYS5ybSA9IFQpLAogICAgbiA9IG4oKQogICkKCmRmID0gbGVmdF9qb2luKAogIGRmLCBzdGFnZSwKICBieSA9ICJwYXJ0aWNpcGFudC5jb2RlIgopICU+JQogIGRwbHlyOjpzZWxlY3QoR0VfbWVhbiwgcGxheWVyLnRlcm1pbmFsX2Nob2ljZSwgZ3JvdXAuaWRfaW5fc3Vic2Vzc2lvbiwgc2Vzc2lvbi5jb2RlLHN1YnNlc3Npb24ucm91bmRfbnVtYmVyLCBwbGF5ZXIubXBjcikgJT4lCiAgZ3JvdXBfYnkoZ3JvdXAuaWRfaW5fc3Vic2Vzc2lvbiwgc2Vzc2lvbi5jb2RlLCBzdWJzZXNzaW9uLnJvdW5kX251bWJlcikgJT4lCiAgc3VtbWFyaXNlKAogICAgdGVybWluYWxfbm9kZSA9IHVuaXF1ZShwbGF5ZXIudGVybWluYWxfY2hvaWNlKSwKICAgIEdFX2RpZmYgPSBhYnMoZGlmZihHRV9tZWFuKSkgJT4lIHJvdW5kKDIpLAogICAgbXBjciA9IHVuaXF1ZShwbGF5ZXIubXBjcikKICApICU+JQogIHNlbGVjdChzZXNzaW9uLmNvZGUsIGdyb3VwLmlkX2luX3N1YnNlc3Npb24sIHN1YnNlc3Npb24ucm91bmRfbnVtYmVyLCBtcGNyLCBHRV9kaWZmLCB0ZXJtaW5hbF9ub2RlKSAlPiUKICBtdXRhdGUodGVybWluYWxfbm9kZT1pZmVsc2UodGVybWluYWxfbm9kZSAlaW4lIGMoIk4xIiwiTjIiKSwiTmF0dXJlIix0ZXJtaW5hbF9ub2RlKSkgJT4lCiAgYXJyYW5nZSgtR0VfZGlmZixzdWJzZXNzaW9uLnJvdW5kX251bWJlciwgZGVzYyh0ZXJtaW5hbF9ub2RlKSkKCmRmX3RhYiA9IGRmICU+JQogIGdyb3VwX2J5KHNlc3Npb24uY29kZSwgZ3JvdXAuaWRfaW5fc3Vic2Vzc2lvbikgJT4lCiAgc3VtbWFyaXNlKAogICAgbXBjciA9IHVuaXF1ZShtcGNyKSwgCiAgICBHRV9kaWZmID0gdW5pcXVlKEdFX2RpZmYpLCAKICAgIEExID0gc3VtKHRlcm1pbmFsX25vZGUgPT0gIkExIikgLyBsZW5ndGgodGVybWluYWxfbm9kZSksCiAgICBGMSA9IHN1bSh0ZXJtaW5hbF9ub2RlID09ICJGMSIpIC8gbGVuZ3RoKHRlcm1pbmFsX25vZGUpLAogICAgQTMgPSBzdW0odGVybWluYWxfbm9kZSA9PSAiQTMiKSAvIGxlbmd0aCh0ZXJtaW5hbF9ub2RlKSwKICAgIE5hdHVyZSA9IHN1bSh0ZXJtaW5hbF9ub2RlID09ICJOYXR1cmUiKSAvIGxlbmd0aCh0ZXJtaW5hbF9ub2RlKQogICkgJT4lCiAgZ2F0aGVyKHRlcm1pbmFsX25vZGUsIHBlcmNlbnQsIEExOk5hdHVyZSkKCmRmX3RhYiA9IGRmX3RhYiAlPiUKICBncm91cF9ieSh0ZXJtaW5hbF9ub2RlLCBtcGNyKSAlPiUKICBzdW1tYXJpc2UoCiAgICBhdmVyYWdlID0gbWVhbihwZXJjZW50KSAlPiUgcm91bmQoMyksCiAgICAjIHNkID0gc2QocGVyY2VudCksCiAgICBzZSA9ICAoc2QocGVyY2VudCkgLyBuKCkpICU+JSByb3VuZCg0KSwKICAgIG4gPSBuKCkKICApCmRmX3RhYiR0ZXJtaW5hbF9ub2RlID0gZmFjdG9yKAogIGRmX3RhYiR0ZXJtaW5hbF9ub2RlLAogIGxldmVscyA9IGMoIkExIiwiRjEiLCJBMyIsIk5hdHVyZSIpCikKZGZfdGFiID0gZGZfdGFiICU+JSAKICBhcnJhbmdlKHRlcm1pbmFsX25vZGUsIG1wY3IpICU+JQogIHQoKQoKCgprYWJsZSgKICBmb3JtYXQgPSAicGFuZG9jIiwKICBhbGlnbiA9ICdjJywKICBjb2wubmFtZXMgPSBjKCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnKSwKICBkZl90YWIKKQoKIyAKIyBkZiAlPiUKIyAgIGdyb3VwX2J5KHNlc3Npb24uY29kZSwgZ3JvdXAuaWRfaW5fc3Vic2Vzc2lvbikgJT4lCiMgICBzdW1tYXJpc2UoCiMgICAgIG1wY3IgPSB1bmlxdWUobXBjciksIAojICAgICBHRV9kaWZmID0gdW5pcXVlKEdFX2RpZmYpLCAKIyAgICAgQTEgPSBzdW0odGVybWluYWxfbm9kZSA9PSAiQTEiKSAvIGxlbmd0aCh0ZXJtaW5hbF9ub2RlKSwKIyAgICAgRjEgPSBzdW0odGVybWluYWxfbm9kZSA9PSAiRjEiKSAvIGxlbmd0aCh0ZXJtaW5hbF9ub2RlKSwKIyAgICAgQTMgPSBzdW0odGVybWluYWxfbm9kZSA9PSAiQTMiKSAvIGxlbmd0aCh0ZXJtaW5hbF9ub2RlKSwKIyAgICAgTmF0dXJlID0gc3VtKHRlcm1pbmFsX25vZGUgPT0gIk5hdHVyZSIpIC8gbGVuZ3RoKHRlcm1pbmFsX25vZGUpCiMgICApICU+JSAKIyAgIGdyb3VwX2J5KG1wY3IpICU+JQojICAgc3VtbWFyaXNlKAojICAgICBBMV9tZWFuID0gbWVhbihBMSksCiMgICAgIEExX3NkID0gc2QoQTEpLAojICAgICBBMV9zZSA9IEExX3NkIC8gbigpLAojICAgICBBMV9uID0gbigpLAojICAgICBGMV9tZWFuID0gbWVhbihGMSksCiMgICAgIEYxX3NkID0gc2QoRjEpLAojICAgICBGMV9zZSA9IEYxX3NkIC8gbigpLAojICAgICBGMV9uID0gbigpLAojICAgICBBM19tZWFuID0gbWVhbihBMyksCiMgICAgIEEzX3NkID0gc2QoQTMpLAojICAgICBBM19zZSA9IEEzX3NkIC8gbigpLAojICAgICBBM19uID0gbigpLAojICAgICBOX21lYW4gPSBtZWFuKE5hdHVyZSksCiMgICAgIE5fc2QgPSBzZChOYXR1cmUpLAojICAgICBOX3NlID0gTl9zZCAvIG4oKSwKIyAgICAgTl9uID0gbigpCiMgICApICU+JQojICAgdCgpCgpgYGAKCgpgYGB7ciwgZWNobyA9IEZBTFNFLCBtZXNzYWdlPUZBTFNFLCBmaWcuaGVpZ2h0PTIuNSwgZmlnLndpZHRoPTQuNSwgZXJyb3I9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGNhY2hlPUZBTFNFfQoKZGYgPSBWQ00gJT4lCiAgbXV0YXRlKAogICAgUGxheWVyID0gYXMuZmFjdG9yKHJvd19udW1iZXIoKSkKICApICU+JQogIGRwbHlyOjpmaWx0ZXIoIWlzLm5hKHBsYXllci5ncm91cF9leGNoYW5nZV9wZXJjZW50KSkgJT4lCiAgZHBseXI6OnNlbGVjdCgKICAgIHBhcnRpY2lwYW50LmNvZGUsCiAgICBQbGF5ZXIsIAogICAgY29udGFpbnMoImdyb3VwX2V4Y2hhbmdlX3BlcmNlbnQiKQogICkgJT4lCiAgZ3JvdXBfYnkocGFydGljaXBhbnQuY29kZSkgJT4lCiAgc3VtbWFyaXplKAogICAgR0VfbWVhbiA9IG1lYW4ocGxheWVyLmdyb3VwX2V4Y2hhbmdlX3BlcmNlbnQsIG5hLnJtID0gVCksCiAgICBuID0gbigpCiAgKQoKZGYgPSBsZWZ0X2pvaW4oCiAgZGYsIHN0YWdlLAogIGJ5ID0gInBhcnRpY2lwYW50LmNvZGUiCikgJT4lCiAgZHBseXI6OnNlbGVjdChHRV9tZWFuLCBwbGF5ZXIudGVybWluYWxfY2hvaWNlLCBncm91cC5pZF9pbl9zdWJzZXNzaW9uLCBzZXNzaW9uLmNvZGUsc3Vic2Vzc2lvbi5yb3VuZF9udW1iZXIsIHBsYXllci5tcGNyKSAlPiUKICBncm91cF9ieShncm91cC5pZF9pbl9zdWJzZXNzaW9uLCBzZXNzaW9uLmNvZGUsIHN1YnNlc3Npb24ucm91bmRfbnVtYmVyKSAlPiUKICBzdW1tYXJpc2UoCiAgICB0ZXJtaW5hbF9ub2RlID0gdW5pcXVlKHBsYXllci50ZXJtaW5hbF9jaG9pY2UpLAogICAgR0VfZGlmZiA9IGFicyhkaWZmKEdFX21lYW4pKSAlPiUgcm91bmQoMiksCiAgICBtcGNyID0gdW5pcXVlKHBsYXllci5tcGNyKQogICkgJT4lCiAgc2VsZWN0KHNlc3Npb24uY29kZSwgZ3JvdXAuaWRfaW5fc3Vic2Vzc2lvbiwgc3Vic2Vzc2lvbi5yb3VuZF9udW1iZXIsIG1wY3IsIEdFX2RpZmYsIHRlcm1pbmFsX25vZGUpICU+JQogIG11dGF0ZSh0ZXJtaW5hbF9ub2RlPWlmZWxzZSh0ZXJtaW5hbF9ub2RlICVpbiUgYygiTjEiLCJOMiIpLCJOYXR1cmUiLHRlcm1pbmFsX25vZGUpKSAlPiUKICBhcnJhbmdlKC1HRV9kaWZmLHN1YnNlc3Npb24ucm91bmRfbnVtYmVyLCBkZXNjKHRlcm1pbmFsX25vZGUpKQoKZGZfdGFiID0gZGYgJT4lCiAgZ3JvdXBfYnkoc2Vzc2lvbi5jb2RlLCBncm91cC5pZF9pbl9zdWJzZXNzaW9uKSAlPiUKICBzdW1tYXJpc2UoCiAgICBtcGNyID0gdW5pcXVlKG1wY3IpLCAKICAgIEdFX2RpZmYgPSB1bmlxdWUoR0VfZGlmZiksIAogICAgQTEgPSBzdW0odGVybWluYWxfbm9kZSA9PSAiQTEiKSAvIGxlbmd0aCh0ZXJtaW5hbF9ub2RlKSwKICAgIEYxID0gc3VtKHRlcm1pbmFsX25vZGUgPT0gIkYxIikgLyBsZW5ndGgodGVybWluYWxfbm9kZSksCiAgICBBMyA9IHN1bSh0ZXJtaW5hbF9ub2RlID09ICJBMyIpIC8gbGVuZ3RoKHRlcm1pbmFsX25vZGUpLAogICAgTmF0dXJlID0gc3VtKHRlcm1pbmFsX25vZGUgPT0gIk5hdHVyZSIpIC8gbGVuZ3RoKHRlcm1pbmFsX25vZGUpCiAgKSAlPiUKICBnYXRoZXIodGVybWluYWxfbm9kZSwgcGVyY2VudCwgQTE6TmF0dXJlKQoKCnByaW50KCcjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjJykKY2F0KCJEbyBncm91cHMgaW4gTVBDUiAwLjMgYW5kIDAuNzUgcmVhY2ggQTEgYXQgdGhlIHNhbWUgcmF0ZXM/IikKCndpbGNveC50ZXN0KAogIChkZl90YWIgJT4lZmlsdGVyKG1wY3I9PTAuMyAmIHRlcm1pbmFsX25vZGU9PSJBMSIpKSRwZXJjZW50LAogIChkZl90YWIgJT4lZmlsdGVyKG1wY3I9PTAuNzUgJiB0ZXJtaW5hbF9ub2RlPT0iQTEiKSkkcGVyY2VudCwKICBwYWlyZWQ9RkFMU0UKKQoKcHJpbnQoJyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMnKQpwcmludCgiRG8gZ3JvdXBzIGluIE1QQ1IgMC4zIGFuZCAwLjc1IHJlYWNoIEYxIGF0IHRoZSBzYW1lIHJhdGVzPyIpCgp3aWxjb3gudGVzdCgKICAoZGZfdGFiICU+JWZpbHRlcihtcGNyPT0wLjMgJiB0ZXJtaW5hbF9ub2RlPT0iRjEiKSkkcGVyY2VudCwKICAoZGZfdGFiICU+JWZpbHRlcihtcGNyPT0wLjc1ICYgdGVybWluYWxfbm9kZT09IkYxIikpJHBlcmNlbnQsCiAgcGFpcmVkPUZBTFNFCikKCnByaW50KCcjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjJykKcHJpbnQoIkRvIGdyb3VwcyBpbiBNUENSIDAuMyBhbmQgMC43NSByZWFjaCBBMyBhdCB0aGUgc2FtZSByYXRlcz8iKQoKd2lsY294LnRlc3QoCiAgKGRmX3RhYiAlPiVmaWx0ZXIobXBjcj09MC4zICYgdGVybWluYWxfbm9kZT09IkEzIikpJHBlcmNlbnQsCiAgKGRmX3RhYiAlPiVmaWx0ZXIobXBjcj09MC43NSAmIHRlcm1pbmFsX25vZGU9PSJBMyIpKSRwZXJjZW50LAogIHBhaXJlZD1GQUxTRQopCgpwcmludCgnIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIycpCnByaW50KCJEbyBncm91cHMgaW4gTVBDUiAwLjMgYW5kIDAuNzUgcmVhY2ggTmF0dXJlIGF0IHRoZSBzYW1lIHJhdGVzPyIpCgp3aWxjb3gudGVzdCgKICAoZGZfdGFiICU+JWZpbHRlcihtcGNyPT0wLjMgJiB0ZXJtaW5hbF9ub2RlPT0iTmF0dXJlIikpJHBlcmNlbnQsCiAgKGRmX3RhYiAlPiVmaWx0ZXIobXBjcj09MC43NSAmIHRlcm1pbmFsX25vZGU9PSJOYXR1cmUiKSkkcGVyY2VudCwKICBwYWlyZWQ9RkFMU0UKKQoKcHJpbnQoJyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMnKQoKCgoKYGBgCgoKV2Ugb25seSBzZWUgYSBzaWduaWZpY2FudCBkaWZmZXJlbmNlIGJldHdlZW4gZ3JvdXBzJyBpbmNsaW5hdGlvbiB0byByZWFjaCB0ZXJtaW5hbCBub2RlIEEzLiAKCgoKCgoKCgoKCmBgYHtyLCBlY2hvID0gRkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGZpZy5oZWlnaHQ9Mi41LCBmaWcud2lkdGg9NC41fQoKCmZyb21fc3Vic2Vzc2lvbiA9IDEKdG9fc3Vic2Vzc2lvbiAgID0gMTAKCmRmID0gc3RhZ2UgJT4lCiAgIyBkaXN0aW5jdCgKICAjICAgZ3JvdXAuaWRfaW5fc3Vic2Vzc2lvbiwgc3Vic2Vzc2lvbi5yb3VuZF9udW1iZXIsIGtlZXBfYWxsID0gVFJVRQogICMgKSAgJT4lCiAgbXV0YXRlKHBsYXllci50ZXJtaW5hbF9jaG9pY2UgPSBpZmVsc2UocGxheWVyLnRlcm1pbmFsX2Nob2ljZSAlaW4lIGMoIk4xIiwiTjIiKSwgIk5hdHVyZSIsIHBsYXllci50ZXJtaW5hbF9jaG9pY2UpKSAlPiUgCiAgZmlsdGVyKCFpcy5uYShwbGF5ZXIudGVybWluYWxfY2hvaWNlKSkgJT4lCiAgZmlsdGVyKAogICAgc3Vic2Vzc2lvbi5yb3VuZF9udW1iZXIgPj0gZnJvbV9zdWJzZXNzaW9uICYgc3Vic2Vzc2lvbi5yb3VuZF9udW1iZXIgPD0gdG9fc3Vic2Vzc2lvbgogICkgJT4lCiAgZ3JvdXBfYnkocGxheWVyLnRlcm1pbmFsX2Nob2ljZSwgcGxheWVyLm1wY3IpICU+JQogIHN1bW1hcmlzZSgKICAgIHZhbHVlID0gbigpLzIKICApICU+JQogIGdyb3VwX2J5KHBsYXllci5tcGNyKSAlPiUKICBtdXRhdGUoCiAgICBUb3RhbF9UZXJtaW5hbE5vZGVzID0gc3VtKHZhbHVlKSwKICAgIHZhbHVlX3BlcmNlbnQgPSB2YWx1ZSAvIFRvdGFsX1Rlcm1pbmFsTm9kZXMKICApICU+JQogIHVuZ3JvdXAoKQoKZGYkcGxheWVyLnRlcm1pbmFsX2Nob2ljZSA9IGZhY3RvcigKICBkZiRwbGF5ZXIudGVybWluYWxfY2hvaWNlLAogIGxldmVscyA9IGMoIkExIiwiRjEiLCJBMyIsIk5hdHVyZSIpCikKCmdncGxvdCgKICBkZiwgCiAgYWVzKAogICAgeCA9IHBsYXllci50ZXJtaW5hbF9jaG9pY2UsCiAgICB5ID0gdmFsdWVfcGVyY2VudCwKICAgIGZpbGwgPSBmYWN0b3IocGxheWVyLm1wY3IpCiAgKQopICsgCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsKICBsYWJzKAogICAgeCA9ICJNUENSIiwKICAgIHkgPSAiUGVyY2VudCIsCiAgICBmaWxsID0gIlRlcm1pbmFsIE5vZGUiLAogICAgdGl0bGUgPSAiVGVybWluYWwgTm9kZSwgUGVyY2VudCwgYnkgTVBDUiBUcmVhdG1lbnQiCiAgKSArCiAgdGhlbWVfbWluaW1hbCgpCgoKYGBgCgoKCgpgYGB7ciwgZWNobyA9IEZBTFNFLCBldmFsID0gRkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGZpZy5oZWlnaHQ9Mi41LCBmaWcud2lkdGg9NC41fQoKCmZyb21fc3Vic2Vzc2lvbiA9IDEKdG9fc3Vic2Vzc2lvbiAgID0gMTAKCmRmID0gc3RhZ2UgJT4lCiAgIyBkaXN0aW5jdCgKICAjICAgZ3JvdXAuaWRfaW5fc3Vic2Vzc2lvbiwgc3Vic2Vzc2lvbi5yb3VuZF9udW1iZXIsIGtlZXBfYWxsID0gVFJVRQogICMgKSAgJT4lCiAgbXV0YXRlKHBsYXllci50ZXJtaW5hbF9jaG9pY2UgPSBpZmVsc2UocGxheWVyLnRlcm1pbmFsX2Nob2ljZSAlaW4lIGMoIk4xIiwiTjIiKSwgIk5hdHVyZSIsIHBsYXllci50ZXJtaW5hbF9jaG9pY2UpKSAlPiUgCiAgZmlsdGVyKCFpcy5uYShwbGF5ZXIudGVybWluYWxfY2hvaWNlKSkgJT4lCiAgZmlsdGVyKAogICAgc3Vic2Vzc2lvbi5yb3VuZF9udW1iZXIgPj0gZnJvbV9zdWJzZXNzaW9uICYgc3Vic2Vzc2lvbi5yb3VuZF9udW1iZXIgPD0gdG9fc3Vic2Vzc2lvbgogICkgJT4lCiAgZ3JvdXBfYnkocGxheWVyLnRlcm1pbmFsX2Nob2ljZSwgcGxheWVyLm1wY3IpICU+JQogIHN1bW1hcmlzZSgKICAgIHZhbHVlID0gbigpLzIKICApICU+JQogIGdyb3VwX2J5KHBsYXllci5tcGNyKSAlPiUKICBtdXRhdGUoCiAgICBUb3RhbF9UZXJtaW5hbE5vZGVzID0gc3VtKHZhbHVlKSwKICAgIHZhbHVlX3BlcmNlbnQgPSB2YWx1ZSAvIFRvdGFsX1Rlcm1pbmFsTm9kZXMKICApICU+JQogIHVuZ3JvdXAoKQoKCmRmJHBsYXllci50ZXJtaW5hbF9jaG9pY2UgPSBmYWN0b3IoCiAgZGYkcGxheWVyLnRlcm1pbmFsX2Nob2ljZSwKICBsZXZlbHMgPSBjKCJBMSIsIkYxIiwiQTMiLCJOYXR1cmUiKQopCgp6ZXJvX29iX25vZGVzID0gIGxldmVscyhkZiRwbGF5ZXIudGVybWluYWxfY2hvaWNlKVshKGxldmVscyhkZiRwbGF5ZXIudGVybWluYWxfY2hvaWNlKSAlaW4lIGRmJHBsYXllci50ZXJtaW5hbF9jaG9pY2UpXQogIApkZiA9IGJpbmRfcm93cygKICBkZiwKICBkYXRhLmZyYW1lKAogICAgcGxheWVyLnRlcm1pbmFsX2Nob2ljZSA9IGZhY3RvcigKICAgICAgemVyb19vYl9ub2RlcywKICAgICAgbGV2ZWxzID0gYygiQTEiLCJGMSIsIkEzIiwiTmF0dXJlIikKICAgICksCiAgICB2YWx1ZSA9IHJlcCgwLGxlbmd0aCh6ZXJvX29iX25vZGVzKSkKICApCikKCmdncGxvdCgKICBkZiwgCiAgYWVzKAogICAgeCA9IGZhY3RvcihwbGF5ZXIubXBjciksCiAgICB5ID0gdmFsdWVfcGVyY2VudCwKICAgIGZpbGwgPSBwbGF5ZXIudGVybWluYWxfY2hvaWNlCiAgKQopICsgCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiKSArCiAgbGFicygKICAgIHggPSAiTVBDUiIsCiAgICB5ID0gIlBlcmNlbnQiLAogICAgZmlsbCA9ICJUZXJtaW5hbCBOb2RlIgogICkgKwogIHRoZW1lX21pbmltYWwoKQoKCmBgYAoKCi0tLS0tCgoKIyMjIEluZXF1YWxpdHkgQXZlcnNpb24gCgpCZWxvdyB3ZSBjb25zaWRlciB0aGUgZWZmZWN0IG9mIHZhcnlpbmcgcHVibGljIGdvb2QgY29udHJpYnV0aW9ucyBvbiB0aGUgdGVybWluYWwgbm9kZXMgc2VsZWN0ZWQgYnkgcGxheWVycyBpbiB0aGUgc3RhZ2UgZ2FtZS4gCgpUaGUgc3RhZ2UgZ2FtZSB3YXMgcGxheWVkIGJ5IHR3by1wbGF5ZXJzLiBFYWNoIHBsYXllciBoYWQgc29tZSBhdmVyYWdlIHB1YmxpYyBnb29kIGNvbnRyaWJ1dGlvbiBmcm9tIHRoZWlyIHRlbiByb3VuZHMgb2YgdGhlIFZDTSBnYW1lLiAKCkluIHRoZSBwbG90IGJlbG93LCB3ZSBzZWUgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGVzZSB0d28tcGxheWVyLWdyb3VwIGRpZmZlcmVuY2VzIGluIHB1YmxpYyBnb29kIGNvbnRyaWJ1dGlvbnMgZm9yIGVhY2ggdGVybWluYWwgbm9kZSBzZWxlY3RlZC4gQSBsYXJnZSBkaWZmZXJlbmNlIGltcGxpZXMgb25lIHBsYXllciBjb250cmlidXRlZCBhIGxvdCBtb3JlIHRvIHRoZSBwdWJsaWMgZ29vZCByZWxhdGl2ZSB0byB0aGUgb3RoZXIsIHdoaWxlIGEgc21hbGwgZGlmZmVyZW5jZSBtZWFucyB0aGUgdHdvIHBsYXllcnMgY29udHJpYnV0dWVkIGF0IHNpbWlsYXIgcmF0ZXMuIFRoZSBwbG90IGFib3ZlIGxhYmVsZWQgIkF2ZXJhZ2UgR3JvdXAgRXhjaGFuZ2UgZnJvbSBWQ00iIHNob3dzIHRoZSBwdWJsaWMgZ29vZCBjb250cmlidXRpb25zIG9mIGVhY2ggZ3JvdXAgaW4gdGhlIHN0YWdlIGdhbWUuIAoKVGhlIHBsb3Qgc2hvd3MgdGhhdCBGMSB0ZW5kZWQgdG8gYmUgc2VsZWN0ZWQgd2hlcmUgcHVibGljIGdvb2QgY29udHJpYnV0aW9uIGRpZmZlcmVuY2VzIHdlcmUgdGhlIHNtYWxsZXN0IHdpdGhpbiBncm91cHMuIFdoaWxlIHBsYXllcnMgdGVuZGVkIHRvIHJlYWNoIHRoZSBuYXR1cmUgbm9kZSB3aGVyZSBkaWZmZXJlbmNlcyBpbiBncm91cCBleGNoYW5nZSBjb250cmlidXRpb25zIHdlcmUgdGhlIGhpZ2hlc3QuIAoKCmBgYHtyLCBlY2hvID0gRkFMU0UsICBtZXNzYWdlPUZBTFNFLCBmaWcuaGVpZ2h0PTQsIGZpZy53aWR0aD01LjV9CiNjb250aW51ZXMgd2l0aCBkZiBhYm92ZQpkZiA9IFZDTSAlPiUKICBtdXRhdGUoCiAgICBQbGF5ZXIgPSBhcy5mYWN0b3Iocm93X251bWJlcigpKQogICkgJT4lCiAgZHBseXI6OmZpbHRlcighaXMubmEocGxheWVyLmdyb3VwX2V4Y2hhbmdlX3BlcmNlbnQpKSAlPiUKICBkcGx5cjo6c2VsZWN0KAogICAgcGFydGljaXBhbnQuY29kZSwKICAgIFBsYXllciwgCiAgICBjb250YWlucygiZ3JvdXBfZXhjaGFuZ2VfcGVyY2VudCIpCiAgKSAlPiUKICBncm91cF9ieShwYXJ0aWNpcGFudC5jb2RlKSAlPiUKICBzdW1tYXJpemUoCiAgICBHRV9tZWFuID0gbWVhbihwbGF5ZXIuZ3JvdXBfZXhjaGFuZ2VfcGVyY2VudCwgbmEucm0gPSBUKSwKICAgIG4gPSBuKCkKICApCgpkZiA9IGxlZnRfam9pbigKICBkZiwgc3RhZ2UsCiAgYnkgPSAicGFydGljaXBhbnQuY29kZSIKKSAlPiUKICBkcGx5cjo6c2VsZWN0KEdFX21lYW4sIHBsYXllci50ZXJtaW5hbF9jaG9pY2UsIGdyb3VwLmlkX2luX3N1YnNlc3Npb24sIHNlc3Npb24uY29kZSxzdWJzZXNzaW9uLnJvdW5kX251bWJlciwgcGxheWVyLm1wY3IpICU+JQogIGdyb3VwX2J5KGdyb3VwLmlkX2luX3N1YnNlc3Npb24sIHNlc3Npb24uY29kZSwgc3Vic2Vzc2lvbi5yb3VuZF9udW1iZXIpICU+JQogIHN1bW1hcmlzZSgKICAgIHRlcm1pbmFsX25vZGUgPSB1bmlxdWUocGxheWVyLnRlcm1pbmFsX2Nob2ljZSksCiAgICBHRV9kaWZmID0gYWJzKGRpZmYoR0VfbWVhbikpICU+JSByb3VuZCgyKSwKICAgIG1wY3IgPSB1bmlxdWUocGxheWVyLm1wY3IpCiAgKSAlPiUKICBzZWxlY3Qoc2Vzc2lvbi5jb2RlLCBncm91cC5pZF9pbl9zdWJzZXNzaW9uLCBzdWJzZXNzaW9uLnJvdW5kX251bWJlciwgbXBjciwgR0VfZGlmZiwgdGVybWluYWxfbm9kZSkgJT4lCiAgbXV0YXRlKHRlcm1pbmFsX25vZGU9aWZlbHNlKHRlcm1pbmFsX25vZGUgJWluJSBjKCJOMSIsIk4yIiksIk5hdHVyZSIsdGVybWluYWxfbm9kZSkpICU+JQogIGFycmFuZ2UoLUdFX2RpZmYsc3Vic2Vzc2lvbi5yb3VuZF9udW1iZXIsIGRlc2ModGVybWluYWxfbm9kZSkpCgpkZiR0ZXJtaW5hbF9ub2RlID0gYXMuZmFjdG9yKGRmJHRlcm1pbmFsX25vZGUpCmRmJE5vZGUgPSBmYWN0b3IoCiAgZGYkdGVybWluYWxfbm9kZSwgCiAgbGV2ZWxzID0gIGMoIkExIiwiRjEiLCJBMyIsICJOYXR1cmUiKQopCgojIGdncGxvdCgKIyAgIGRmLCAKIyAgIGFlcyh4ID0gTm9kZSwgeSA9IEdFX2RpZmYsZmlsbD1mYWN0b3IobXBjcikpCiMgKSArCiMgICBnZW9tX2JveHBsb3QoKSArCiMgICB0aGVtZV9saWdodCgpICsKIyAgIGxhYnMoCiMgICAgIHggPSAiVGVybWluYWwgTm9kZSIsCiMgICAgIHkgPSAiRGlmZmVyZW5jZSBCZXR3ZWVuXG5Hcm91cCBFeGNoYW5nZSBDb250cmlidXRpb25zIiwKIyAgICAgdGl0bGUgPSAiQm94cGxvdCAtIE1lZCAmIDFzdC8zcmQgUXVhcnRpbGVzIgojICAgKQoKCiMgZnVuY3Rpb24gZm9yIGNvbXB1dGluZyBtZWFuLCBEUywgbWF4IGFuZCBtaW4gdmFsdWVzCm1pbi5tZWFuLnNkLm1heCA8LSBmdW5jdGlvbih4KSB7CiAgciA8LSBjKG1pbih4KSwgbWVhbih4KSAtIHNkKHgpLCBtZWFuKHgpLCBtZWFuKHgpICsgc2QoeCksIG1heCh4KSkKICBuYW1lcyhyKSA8LSBjKCJ5bWluIiwgImxvd2VyIiwgIm1pZGRsZSIsICJ1cHBlciIsICJ5bWF4IikKICByCn0KCmRmJHRlcm1pbmFsX25vZGUgPSBhcy5mYWN0b3IoZGYkdGVybWluYWxfbm9kZSkKZGYkTm9kZSA9IGZhY3RvcigKICBkZiR0ZXJtaW5hbF9ub2RlLCAKICBsZXZlbHMgPSAgYygiQTEiLCJGMSIsIkEzIiwgIk5hdHVyZSIpCikKIyBnZ3Bsb3QgY29kZQpwMSA8LSBnZ3Bsb3QoCiAgZGF0YSA9IGRmLCAKICBhZXMoCiAgICB5ID0gR0VfZGlmZiwgCiAgICB4ID0gTm9kZSkKKQpwMSA8LSBwMSArIAogIHN0YXRfc3VtbWFyeShmdW4uZGF0YSA9IG1pbi5tZWFuLnNkLm1heCwgZ2VvbSA9ICJib3hwbG90IiwgYWxwaGEgPSAuNSkgKyAKICBnZW9tX2ppdHRlcihwb3NpdGlvbj1wb3NpdGlvbl9qaXR0ZXIod2lkdGg9LjMpLCBzaXplPTMsIGFscGhhID0gLjEpICsgCiAgbGFicygKICAgIHRpdGxlID0gIkJveHBsb3Qgd2l0aCBtZWRpYW4sIDk1JUNJLCBtaW4uICYgbWF4LiIsCiAgICB4ID0gIlRlcm1pbmFsIE5vZGUiLAogICAgeSA9ICJEaWZmZXJlbmNlIEJldHdlZW5cbkdyb3VwIEV4Y2hhbmdlIENvbnRyaWJ1dGlvbnMiICAKICApICsKICB0aGVtZV9taW5pbWFsKCkKcDEKCgpgYGAKCgoKLS0tLQoKIyMjIyBSZWFjaGluZyBOYXR1cmUKCgpCZWxvdyBpcyBhIHBhcmFtZXRyaWMgdGVzdCwgCgokTl97Z30gPSBcYmV0YV8wICsgXGJldGFfMSBcY2RvdCBcZGVsdGEgTVBDUl97Z30gKyBcYmV0YV8zIFxjZG90IGxuKEdFZGlmZl9nKSArIFxlcHNpbG9uX3tnfSQKCi0gV2hlcmUgJE5fe2d9JCBpcyB0aGUgcGVyY2VudCBvZiB0aGUgdGltZSBncm91cCAkZyQgcmVhY2hlZCBuYXR1cmUgYXMgdGhlaXIgdGVybWluYWwgbm9kZSwKLSAkXGRlbHRhIE1QQ1Jfe2d9JCBpcyAxIGlmIHRoaXMgZ3JvdXAgZmFjZWQgYSBNUENSIG9mIDAuMyBhbmQgMCBvdGhlcndpc2UsIAotICRHRWRpZmZfZyQgaXMgdGhpcyBncm91cCdzIGRpZmZlcmVuY2UgYmV0d2VlbiBwbGF5ZXIgYXZlcmFnZSBwdWJsaWMgZ29vZCBjb250cmlidXRpb24gcmF0ZXMgaW4gdGhlIFZDTSBnYW1lLiAKCgpgYGB7ciwgZWNobyA9IEZBTFNFLCBtZXNzYWdlPUZBTFNFLCBmaWcuaGVpZ2h0PTIuNSwgZmlnLndpZHRoPTQuNX0KCgpmcm9tX3N1YnNlc3Npb24gPSAxCnRvX3N1YnNlc3Npb24gICA9IDEwCmRmX2dyb3VwID0gc3RhZ2UgJT4lCiAgZmlsdGVyKAogICAgc3Vic2Vzc2lvbi5yb3VuZF9udW1iZXIgPj0gZnJvbV9zdWJzZXNzaW9uICYgc3Vic2Vzc2lvbi5yb3VuZF9udW1iZXIgPD0gdG9fc3Vic2Vzc2lvbgogICkgJT4lCiAgZ3JvdXBfYnkoc2Vzc2lvbi5jb2RlLCBncm91cC5pZF9pbl9zdWJzZXNzaW9uKSAlPiUKICBzdW1tYXJpemUoCiAgICBBMV9wZXJjZW50ID0gc3VtKGlmZWxzZShwbGF5ZXIudGVybWluYWxfY2hvaWNlID09ICJBMSIsMSwwKSkgLyBsZW5ndGgocGxheWVyLnRlcm1pbmFsX2Nob2ljZSksCiAgICBGMV9wZXJjZW50ID0gc3VtKGlmZWxzZShwbGF5ZXIudGVybWluYWxfY2hvaWNlID09ICJGMSIsMSwwKSkgLyBsZW5ndGgocGxheWVyLnRlcm1pbmFsX2Nob2ljZSksCiAgICBBM19wZXJjZW50ID0gc3VtKGlmZWxzZShwbGF5ZXIudGVybWluYWxfY2hvaWNlID09ICJBMyIsMSwwKSkgLyBsZW5ndGgocGxheWVyLnRlcm1pbmFsX2Nob2ljZSksCiAgICBOMV9wZXJjZW50ID0gc3VtKGlmZWxzZShwbGF5ZXIudGVybWluYWxfY2hvaWNlID09ICJOMSIsMSwwKSkgLyBsZW5ndGgocGxheWVyLnRlcm1pbmFsX2Nob2ljZSksCiAgICBOMl9wZXJjZW50ID0gc3VtKGlmZWxzZShwbGF5ZXIudGVybWluYWxfY2hvaWNlID09ICJOMiIsMSwwKSkgLyBsZW5ndGgocGxheWVyLnRlcm1pbmFsX2Nob2ljZSksCiAgICBOYXR1cmVfcGVyY2VudCA9IHN1bShpZmVsc2UocGxheWVyLnRlcm1pbmFsX2Nob2ljZSAlaW4lIGMoIk4yIiwiTjEiKSwxLDApKSAvIGxlbmd0aChwbGF5ZXIudGVybWluYWxfY2hvaWNlKSwKICAgIG1wY3IgPSB1bmlxdWUocGxheWVyLm1wY3IpLAogICAgTVBDUl8wLjMwID0gaWZlbHNlKG1wY3IgPT0gMC4zLCAxLCAwKSwKICAgIEdFX2RpZmYgPSBtYXgodmNtX21lYW5fZ2VfcGVyY2VudCkgLSBtaW4odmNtX21lYW5fZ2VfcGVyY2VudCkKICApICU+JQogIHVuZ3JvdXAoKQoKCgoKCnJlZ19OX2dyb3VwID0gbG0oCiAgTmF0dXJlX3BlcmNlbnQgfiBNUENSXzAuMzAgKyBsb2coR0VfZGlmZiksCiAgZGZfZ3JvdXAKKQpzdW1tYXJ5KHJlZ19OX2dyb3VwKQoKYGBgCgoKQmVsb3cgaXMgYW5vdGhlciBwYXJhbWV0cmljIHRlc3QsIHRoaXMgdGltZSB1c2luZyBncm91cC1yb3VuZCBsZXZlbCBvYnNlcnZhdGlvbnMgdG8gdGVzdCB0aGUgZm9sbG93aW5nLCAKCiROX3tndH0gPSBcYmV0YV8wICsgXGJldGFfMSBcY2RvdCBcZGVsdGEgTVBDUl97Z30gKyBcYmV0YV8zIFxjZG90IGxuKEdFZGlmZl9nKSArIFxlcHNpbG9uX3tndH0kCgotIFdoZXJlICROX3tndH0kIGlzIDEgaWYgZ3JvdXAgJGckIGVhY2hlZCBuYXR1cmUgYXMgdGVybWluYWwgbm9kZSBpbiByb3VuZCAkdCQgYW5kIDAgb3RoZXJ3aXNlLAotICRcZGVsdGEgTVBDUl97Z30kIGlzIDEgaWYgdGhpcyBncm91cCBmYWNlZCBhIE1QQ1Igb2YgMC4zIGFuZCAwIG90aGVyd2lzZSwgCi0gJEdFZGlmZl9nJCBpcyB0aGlzIGdyb3VwJ3MgZGlmZmVyZW5jZSBiZXR3ZWVuIHBsYXllciBhdmVyYWdlIHB1YmxpYyBnb29kIGNvbnRyaWJ1dGlvbiByYXRlcyBpbiB0aGUgVkNNIGdhbWUuIAoKCmBgYHtyLCBlY2hvID0gRkFMU0UsICBtZXNzYWdlPUZBTFNFLCBmaWcuaGVpZ2h0PTIuNSwgZmlnLndpZHRoPTQuNX0KCgpmcm9tX3N1YnNlc3Npb24gPSAxCnRvX3N1YnNlc3Npb24gICA9IDEwCmRmX3BlciA9IHN0YWdlICU+JQogIGZpbHRlcigKICAgIHN1YnNlc3Npb24ucm91bmRfbnVtYmVyID49IGZyb21fc3Vic2Vzc2lvbiAmIHN1YnNlc3Npb24ucm91bmRfbnVtYmVyIDw9IHRvX3N1YnNlc3Npb24KICApICU+JQogIGdyb3VwX2J5KHNlc3Npb24uY29kZSwgZ3JvdXAuaWRfaW5fc3Vic2Vzc2lvbiwgc3Vic2Vzc2lvbi5yb3VuZF9udW1iZXIpICU+JQogIHN1bW1hcml6ZSgKICAgIEExID0gc3VtKGlmZWxzZShwbGF5ZXIudGVybWluYWxfY2hvaWNlID09ICJBMSIsMSwwKSkgLyBsZW5ndGgocGxheWVyLnRlcm1pbmFsX2Nob2ljZSksCiAgICBGMSA9IHN1bShpZmVsc2UocGxheWVyLnRlcm1pbmFsX2Nob2ljZSA9PSAiRjEiLDEsMCkpIC8gbGVuZ3RoKHBsYXllci50ZXJtaW5hbF9jaG9pY2UpLAogICAgQTMgPSBzdW0oaWZlbHNlKHBsYXllci50ZXJtaW5hbF9jaG9pY2UgPT0gIkEzIiwxLDApKSAvIGxlbmd0aChwbGF5ZXIudGVybWluYWxfY2hvaWNlKSwKICAgIE4xID0gc3VtKGlmZWxzZShwbGF5ZXIudGVybWluYWxfY2hvaWNlID09ICJOMSIsMSwwKSkgLyBsZW5ndGgocGxheWVyLnRlcm1pbmFsX2Nob2ljZSksCiAgICBOMiA9IHN1bShpZmVsc2UocGxheWVyLnRlcm1pbmFsX2Nob2ljZSA9PSAiTjIiLDEsMCkpIC8gbGVuZ3RoKHBsYXllci50ZXJtaW5hbF9jaG9pY2UpLAogICAgTmF0dXJlPSBzdW0oaWZlbHNlKHBsYXllci50ZXJtaW5hbF9jaG9pY2UgJWluJSBjKCJOMiIsIk4xIiksMSwwKSkgLyBsZW5ndGgocGxheWVyLnRlcm1pbmFsX2Nob2ljZSksCiAgICBtcGNyID0gdW5pcXVlKHBsYXllci5tcGNyKSwKICAgIE1QQ1JfMC4zMCA9IGlmZWxzZShtcGNyID09IDAuMywgMSwgMCksCiAgICBHRV9kaWZmID0gbWF4KHZjbV9tZWFuX2dlX3BlcmNlbnQpIC0gbWluKHZjbV9tZWFuX2dlX3BlcmNlbnQpCiAgKSAlPiUKICB1bmdyb3VwKCkKCnJlZ19OX3BlciA9IGxtKAogIE5hdHVyZSB+IE1QQ1JfMC4zMCArIGxvZyhHRV9kaWZmKSwKICBkZl9wZXIKKQpzdW1tYXJ5KHJlZ19OX3BlcikKCgpgYGAKCgojIyMjIFJlYWNoaW5nIEYxCgoKQmVsb3cgaXMgYSBwYXJhbWV0cmljIHRlc3QsIAoKJEYxX3tnfSA9IFxiZXRhXzAgKyBcYmV0YV8xIFxjZG90IFxkZWx0YSBNUENSX3tnfSArIFxiZXRhXzMgXGNkb3QgbG4oR0VkaWZmX2cpICsgXGVwc2lsb25fe2d9JAoKLSBXaGVyZSAkRjFfe2d9JCBpcyB0aGUgcGVyY2VudCBvZiB0aGUgdGltZSBncm91cCAkZyQgcmVhY2hlZCBGMSBhcyB0aGVpciB0ZXJtaW5hbCBub2RlLAotICRcZGVsdGEgTVBDUl97Z30kIGlzIDEgaWYgdGhpcyBncm91cCBmYWNlZCBhIE1QQ1Igb2YgMC4zIGFuZCAwIG90aGVyd2lzZSwgCi0gJEdFZGlmZl9nJCBpcyB0aGlzIGdyb3VwJ3MgZGlmZmVyZW5jZSBiZXR3ZWVuIHBsYXllciBhdmVyYWdlIHB1YmxpYyBnb29kIGNvbnRyaWJ1dGlvbiByYXRlcyBpbiB0aGUgVkNNIGdhbWUuIAoKCmBgYHtyLCBlY2hvID0gRkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGZpZy5oZWlnaHQ9Mi41LCBmaWcud2lkdGg9NC41fQoKcmVnX0YxX2dyb3VwID0gbG0oCiAgRjFfcGVyY2VudCB+IE1QQ1JfMC4zMCArIGxvZyhHRV9kaWZmKSwKICBkZl9ncm91cAopCnN1bW1hcnkocmVnX0YxX2dyb3VwKQoKYGBgCgoKQmVsb3cgaXMgYW5vdGhlciBwYXJhbWV0cmljIHRlc3QsIHRoaXMgdGltZSB1c2luZyBncm91cC1yb3VuZCBsZXZlbCBvYnNlcnZhdGlvbnMgdG8gdGVzdCB0aGUgZm9sbG93aW5nLCAKCiRGMV97Z3R9ID0gXGJldGFfMCArIFxiZXRhXzEgXGNkb3QgXGRlbHRhIE1QQ1Jfe2d9ICsgXGJldGFfMyBcY2RvdCBsbihHRWRpZmZfZykgKyBcZXBzaWxvbl97Z3R9JAoKLSBXaGVyZSAkRjFfe2d0fSQgaXMgMSBpZiBncm91cCAkZyQgZWFjaGVkIEYxIGFzIHRlcm1pbmFsIG5vZGUgaW4gcm91bmQgJHQkIGFuZCAwIG90aGVyd2lzZSwKLSAkXGRlbHRhIE1QQ1Jfe2d9JCBpcyAxIGlmIHRoaXMgZ3JvdXAgZmFjZWQgYSBNUENSIG9mIDAuMyBhbmQgMCBvdGhlcndpc2UsIAotICRHRWRpZmZfZyQgaXMgdGhpcyBncm91cCdzIGRpZmZlcmVuY2UgYmV0d2VlbiBwbGF5ZXIgYXZlcmFnZSBwdWJsaWMgZ29vZCBjb250cmlidXRpb24gcmF0ZXMgaW4gdGhlIFZDTSBnYW1lLiAKCgpgYGB7ciwgZWNobyA9IEZBTFNFLCBtZXNzYWdlPUZBTFNFLCBmaWcuaGVpZ2h0PTIuNSwgZmlnLndpZHRoPTQuNX0KCgoKcmVnX0YxX3BlciA9IGxtKAogIEYxIH4gTVBDUl8wLjMwICsgbG9nKEdFX2RpZmYpLAogIGRmX3BlcgopCnN1bW1hcnkocmVnX0YxX3BlcikKCgpgYGAKCi0tLS0tLS0KCiMjIyMgUmVhY2hpbmcgQTEKCgpCZWxvdyBpcyBhIHBhcmFtZXRyaWMgdGVzdCwgCgokQTFfe2d9ID0gXGJldGFfMCArIFxiZXRhXzEgXGNkb3QgXGRlbHRhIE1QQ1Jfe2d9ICsgXGJldGFfMyBcY2RvdCBsbihHRWRpZmZfZykgKyBcZXBzaWxvbl97Z30kCgotIFdoZXJlICRBMV97Z30kIGlzIHRoZSBwZXJjZW50IG9mIHRoZSB0aW1lIGdyb3VwICRnJCByZWFjaGVkIEExIGFzIHRoZWlyIHRlcm1pbmFsIG5vZGUsCi0gJFxkZWx0YSBNUENSX3tnfSQgaXMgMSBpZiB0aGlzIGdyb3VwIGZhY2VkIGEgTVBDUiBvZiAwLjMgYW5kIDAgb3RoZXJ3aXNlLCAKLSAkR0VkaWZmX2ckIGlzIHRoaXMgZ3JvdXAncyBkaWZmZXJlbmNlIGJldHdlZW4gcGxheWVyIGF2ZXJhZ2UgcHVibGljIGdvb2QgY29udHJpYnV0aW9uIHJhdGVzIGluIHRoZSBWQ00gZ2FtZS4gCgoKYGBge3IsIGVjaG8gPSBGQUxTRSwgbWVzc2FnZT1GQUxTRSwgZmlnLmhlaWdodD0yLjUsIGZpZy53aWR0aD00LjV9CgoKCgpyZWdfQTFfZ3JvdXAgPSBsbSgKICBBMV9wZXJjZW50IH4gTVBDUl8wLjMwICsgbG9nKEdFX2RpZmYpLAogIGRmX2dyb3VwCikKc3VtbWFyeShyZWdfQTFfZ3JvdXApCgpgYGAKCgpCZWxvdyBpcyBhbm90aGVyIHBhcmFtZXRyaWMgdGVzdCwgdGhpcyB0aW1lIHVzaW5nIGdyb3VwLXJvdW5kIGxldmVsIG9ic2VydmF0aW9ucyB0byB0ZXN0IHRoZSBmb2xsb3dpbmcsIAoKJEExX3tndH0gPSBcYmV0YV8wICsgXGJldGFfMSBcY2RvdCBcZGVsdGEgTVBDUl97Z30gKyBcYmV0YV8zIFxjZG90IGxuKEdFZGlmZl9nKSArIFxlcHNpbG9uX3tndH0kCgotIFdoZXJlICRBMV97Z3R9JCBpcyAxIGlmIGdyb3VwICRnJCBlYWNoZWQgQTEgYXMgdGVybWluYWwgbm9kZSBpbiByb3VuZCAkdCQgYW5kIDAgb3RoZXJ3aXNlLAotICRcZGVsdGEgTVBDUl97Z30kIGlzIDEgaWYgdGhpcyBncm91cCBmYWNlZCBhIE1QQ1Igb2YgMC4zIGFuZCAwIG90aGVyd2lzZSwgCi0gJEdFZGlmZl9nJCBpcyB0aGlzIGdyb3VwJ3MgZGlmZmVyZW5jZSBiZXR3ZWVuIHBsYXllciBhdmVyYWdlIHB1YmxpYyBnb29kIGNvbnRyaWJ1dGlvbiByYXRlcyBpbiB0aGUgVkNNIGdhbWUuIAoKCmBgYHtyLCBlY2hvID0gRkFMU0UsICBtZXNzYWdlPUZBTFNFLCBmaWcuaGVpZ2h0PTIuNSwgZmlnLndpZHRoPTQuNX0KCgpyZWdfQTFfcGVyID0gbG0oCiAgQTEgfiBNUENSXzAuMzAgKyBsb2coR0VfZGlmZiksCiAgZGZfcGVyCikKc3VtbWFyeShyZWdfQTFfcGVyKQoKCmBgYAoKLS0tLS0tLS0KCiMjIyMgUmVhY2hpbmcgQTMKCgpCZWxvdyBpcyBhIHBhcmFtZXRyaWMgdGVzdCwgCgokQTNfe2d9ID0gXGJldGFfMCArIFxiZXRhXzEgXGNkb3QgXGRlbHRhIE1QQ1Jfe2d9ICsgXGJldGFfMyBcY2RvdCBsbihHRWRpZmZfZykgKyBcZXBzaWxvbl97Z30kCgotIFdoZXJlICRBM197Z30kIGlzIHRoZSBwZXJjZW50IG9mIHRoZSB0aW1lIGdyb3VwICRnJCByZWFjaGVkIEEzIGFzIHRoZWlyIHRlcm1pbmFsIG5vZGUsCi0gJFxkZWx0YSBNUENSX3tnfSQgaXMgMSBpZiB0aGlzIGdyb3VwIGZhY2VkIGEgTVBDUiBvZiAwLjMgYW5kIDAgb3RoZXJ3aXNlLCAKLSAkR0VkaWZmX2ckIGlzIHRoaXMgZ3JvdXAncyBkaWZmZXJlbmNlIGJldHdlZW4gcGxheWVyIGF2ZXJhZ2UgcHVibGljIGdvb2QgY29udHJpYnV0aW9uIHJhdGVzIGluIHRoZSBWQ00gZ2FtZS4gCgoKYGBge3IsIGVjaG8gPSBGQUxTRSwgbWVzc2FnZT1GQUxTRSwgZmlnLmhlaWdodD0yLjUsIGZpZy53aWR0aD00LjV9CgoKCnJlZ19BM19ncm91cCA9IGxtKAogIEEzX3BlcmNlbnQgfiBNUENSXzAuMzAgKyBsb2coR0VfZGlmZiksCiAgZGZfZ3JvdXAKKQpzdW1tYXJ5KHJlZ19BM19ncm91cCkKCmBgYAoKCkJlbG93IGlzIGFub3RoZXIgcGFyYW1ldHJpYyB0ZXN0LCB0aGlzIHRpbWUgdXNpbmcgZ3JvdXAtcm91bmQgbGV2ZWwgb2JzZXJ2YXRpb25zIHRvIHRlc3QgdGhlIGZvbGxvd2luZywgCgokQTNfe2d0fSA9IFxiZXRhXzAgKyBcYmV0YV8xIFxjZG90IFxkZWx0YSBNUENSX3tnfSArIFxiZXRhXzMgXGNkb3QgbG4oR0VkaWZmX2cpICsgXGVwc2lsb25fe2d0fSQKCi0gV2hlcmUgJEEzX3tndH0kIGlzIDEgaWYgZ3JvdXAgJGckIGVhY2hlZCBBMyBhcyB0ZXJtaW5hbCBub2RlIGluIHJvdW5kICR0JCBhbmQgMCBvdGhlcndpc2UsCi0gJFxkZWx0YSBNUENSX3tnfSQgaXMgMSBpZiB0aGlzIGdyb3VwIGZhY2VkIGEgTVBDUiBvZiAwLjMgYW5kIDAgb3RoZXJ3aXNlLCAKLSAkR0VkaWZmX2ckIGlzIHRoaXMgZ3JvdXAncyBkaWZmZXJlbmNlIGJldHdlZW4gcGxheWVyIGF2ZXJhZ2UgcHVibGljIGdvb2QgY29udHJpYnV0aW9uIHJhdGVzIGluIHRoZSBWQ00gZ2FtZS4gCgoKYGBge3IsIGVjaG8gPSBGQUxTRSwgbWVzc2FnZT1GQUxTRSwgZmlnLmhlaWdodD0yLjUsIGZpZy53aWR0aD00LjV9CgoKcmVnX0EzX3BlciA9IGxtKAogIEEzIH4gTVBDUl8wLjMwICsgbG9nKEdFX2RpZmYpLAogIGRmX3BlcgopCnN1bW1hcnkocmVnX0EzX3BlcikKCgpgYGAKCgotLS0tLQoKYGBge3IsIGVjaG8gPSBGQUxTRSwgbWVzc2FnZT1GQUxTRSwgZmlnLmhlaWdodD0yLjUsIGZpZy53aWR0aD00LjV9CgoKCgpgYGAKCgotLS0tLQoKYGBge3IsIHJlc3VsdHM9J2FzaXMnLCBlY2hvPUZBTFNFfQoKY2F0KAogICIgQ29tcGlsZWQgIiwKICBhcy5jaGFyYWN0ZXIoYXMuUE9TSVhsdChTeXMudGltZSgpLCAiR01UIikpLCAiIEdNVCIsCiAgCiAgc2VwID0gIiIKKQpgYGA=